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. 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). 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. Use externalMetric for exploration when no saved metric matches; prefer saved { type: "metric" } when one exists. PERIOD: prefer datePreset (same DatePreset enum as dashboards/reports, e.g. MTD, LAST_MONTH, TRAILING_30_DAYS, LAST_3_MONTHS, YTD) over hand-computed from/to whenever a preset matches — 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. 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 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" } • "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" } • "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" } • 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

TableJSON 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.
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 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.
forecastDaysNoExtend the query window by N days into the future and include forecasted values.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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"
      +  }
      +]
  2. 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"
      +]
  3. 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"
      +  }
      +]
  4. 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"
      +  }
      +]
  5. 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"
      +}
  6. 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"
      +  }
      +]
  7. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses key operational behaviors: 'Hour requires Costory Pro', 'default to 100 groups', 'Costory will not fill an empty weekly series', and 'Response includes the resolved period dates.' It also flags incompatibilities (changePoint with compare) and default values (limit, aggregator). No contradiction with annotations.

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?

The description is well-structured with clear section labels (MINIMUM VALID CALL, QUERY NAMING, PERIOD, EXAMPLES) and is front-loaded with a minimal call example. It is long and repeats some provider details already present in the schema's externalMetric description, but the organized headers and numerous concrete examples justify most of the length for a tool of this complexity.

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?

Given the tool's complexity (11 parameters, nested oneOf schemas, multiple provider integrations, and no output schema), the description covers all necessary invocation aspects: query types, naming, period selection, comparison, formulas, budgets, limits, and post-call follow-up suggestions (list_events, suggest_actions). It also warns about edge cases like null label handling and Datadog query pass-through restrictions.

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

Parameters5/5

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

Although schema description coverage is 100%, the description adds substantial semantics: the naming convention (short ids for name, human labels in alias), that budgetId expects the budget version ID (not the parent ID), rollingAggregation usage for cumulative budgets, and provider-specific field requirements for externalMetric (e.g., BigQuery needs dateColumn/metricColumn/gapFillingMethod). This goes far beyond the schema's property descriptions.

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?

The opening sentence states a specific, expansive purpose: 'Unified query tool for cost data, custom metrics, usage metrics, external (live integration) metrics, period comparisons, formulas, and budgets.' This clearly distinguishes it from sibling tools like search (dimension lookup), list_metrics (metadata discovery), and get (entity retrieval) by enumerating the exact data types it queries.

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?

The description gives explicit when-to-use guidance and alternatives: 'Use externalMetric for exploration when no saved metric matches; prefer saved { type: "metric" } when one exists.' It also states required prerequisite calls (suggest_usage_metrics first, list_metrics with includeExternal, get for budgetVersionId) and explains when to prefer datePreset over 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