Skip to main content
Glama

Update report

fastero_update_report
DestructiveIdempotent

Change a report (a dashboard widget) in place: its name or description, how it draws (chartType together with the assignments that chart needs), its display settings, or a text block’s text. Every dashboard that places it shows the change, and what it replaces is not kept, except on a Vega-Lite chart or one becoming one: vegaLite rebuilds it, and restoreRevision brings back any of its last 20 versions. Fields left out stay as they are, and each setting given (format, decimals, prefix, suffix, dataLabels, legend, regroup, lowerIsBetter, referenceLines, sortOrder, colors, columnFormats) changes that one and keeps the others. The saved query it reads cannot be changed here: fastero_update_query changes the SQL for every report on that query. To keep this report and add another view of the same query, fastero_create_report; to move it or take it off a dashboard, fastero_update_dashboard. A chartType sent without the columns its chart needs is refused, as is text for anything but a text block; assignments sent without chartType replace the old ones unchecked. Owners, admins and editors of the project can change it; a report with an access list of its own, only the editors that list names. Returns the updated report with its url.

Input Schema

NameRequiredDescriptionDefault
nameNoA new name, the title people see above the chart.
textNoA text block’s new text, in markdown. Refused for any other report.
colorsNoA colour for each category value the chart draws, say { "East": "#22c55e" }: that bar, slice or tile in it (#rrggbb, #rgb or rgb(r, g, b)). Values left out keep the chart's own colours; on an update the map replaces the chart's, and {} removes it.
formatNoHow numbers read: currency adds $, percent adds %, compact abbreviates (1.2K). Defaults to number.
legendNoauto shows a legend for two series or more.
prefixNoWritten before each number: a currency other than dollars, say "€".
suffixNoWritten after each number: a unit, say " MWh" or " s".
regroupNoHow the numbers combine when the dashboard's period switch groups dates by a longer period: sum for totals and counts (the default), average for rates, prices, averages and percentiles (the default for percent), last for levels such as active users or a balance.
decimalsNoDigits after the decimal point, 0 to 6. Unset, money shows 2 and other numbers the digits they have.
reportIdYesA report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard.
vegaLiteNoA Vega-Lite v6 description, only for a chart chartType can't say: several panels, several kinds of mark on one chart, bands, shaded periods, labelled lines, a log or reversed axis, a colour per row, floating bars, side-by-side boxplots. A plain bar, line or pie stays chartType: it is shorter, follows the dashboard's Day/Week/Month switch, and a person can edit it by hand, which nobody can do to this. Rebuild an existing chart this way only when asked for something its type can't do; its old version stays in its history. The rows are the query's, so give no data. Give no config, background, padding, autosize or top-level title: the app decides the look, and the widget's name is the title (title.subtitle stays). About 800 wide in all, in numbers: width 720, height 320. Leave text colours to the theme. Not available: params, selections, url, href, the image and geoshape marks, and nested data. A fixed level line takes y: { datum: 80 }, and x: null under a shared x, or it draws one line per x. Formulas may call only simple functions (format, round, toDate, year and the like). Anything else, and any number people will quote, belongs in the query, so it reads the same in every view. sort: null keeps the query's order. To read well: say the finding in the name or subtitle, with its number, or, on a chart that refreshes, in a text mark worked out from the rows, since typed words go stale; a mid grey plus one accent colour, mid-tones that read on a light and a dark card, more only where they mean something; a target or limit on the chart as a labelled mark; values on the marks or an axis, not both; label only the points the finding rests on; bars start at zero. On a chart that refreshes, keep words and legends off the plot, where a later bar can land on them: a legend with orient "top", a text mark with y: -6 and baseline "bottom". Example: { "width": 720, "height": 320, "encoding": { "x": { "field": "month", "type": "temporal" } }, "layer": [ { "mark": { "type": "bar", "color": "#94a3b8" }, "encoding": { "y": { "field": "orders", "type": "quantitative" } } }, { "mark": { "type": "line", "color": "#3b82f6" }, "encoding": { "y": { "field": "avg_3m", "type": "quantitative" } } }, { "mark": { "type": "rule", "strokeDash": [4, 4] }, "encoding": { "x": null, "y": { "datum": 500 } } } ] }
chartTypeNoSame values as fastero_create_report; give the assignments that chart needs with it.
projectIdYesThe project’s id, from fastero_list_projects.
sortOrderNoThe order a bar, horizontal_bar, pie or waterfall chart draws its categories in: by value, smallest first (asc) or largest first (desc), or as the query returns them (none, the default). A horizontal_bar reads desc from the top.
changeNoteNoFor a Vega-Lite chart: what this change does and why, in a few words. People read it in Chart history.
dataLabelsNoValues written on the chart. auto writes them on 12 points or fewer, and a pie's shares always.
assignmentsNoWhich result columns a chart plots, by chart type: bar, horizontal_bar, stacked_bar {category, value_slot_1, value_slot_2...}; line {xAxis, yAxis, optional value_slot_2, value_slot_3...} (a line each); time_series {date, yAxis1, optional yAxis2}; pie {category, value}; scatter {xAxis, yAxis}; waterfall {category, value}; combo {category, bar_value, line_value}; heatmap {xAxis, yAxis, value}; treemap {name, value}; bubble {xAxis, yAxis, size, optional category}; map {latitude, longitude, optional size, category, label}. Values are column names from the query result. Write the query to return one row per point (aggregate in SQL).
descriptionNoWhat the chart shows, in a sentence ("Booked revenue by region, last 90 days"): shown behind an (i) beside its title and read by screen readers.
columnFormatsNoFor a table: a number format for each column that holds numbers, say { "Spend": "currency", "Share": "percent" }.
lowerIsBetterNoFor a number card: a fall is good news (costs, cancellations, churn), so a fall shows green.
referenceLinesNoLines and bands drawn across a bar, horizontal_bar, stacked_bar, line, time_series, combo or scatter chart: { type: "average" } a dashed line at the average of the points drawn; { type: "value", value } a line at a fixed value, such as a target; { type: "band", from, to } a shaded range. Each may have a label and a color (#rrggbb, #rgb or rgb(r, g, b)). The list replaces the chart's; [] removes them.
restoreRevisionNoFor a chart with a history: bring back this version, from chartHistoryNotes (fastero_get_report). Restoring is a change too, so it can be undone.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / vegaLite / description
      Previous value: -"A Vega-Lite v6 description, only for a chart chartType can't say: several panels, several kinds of mark on one chart, bands, shaded periods, labelled lines, a log or reversed axis, a colour per row, floating bars, side-by-side boxplots. A plain bar, line or pie stays chartType: it is shorter, follows the dashboard's Day/Week/Month switch, and a person can edit it by hand, which nobody can do to this. Rebuild an existing chart this way only when asked for something its type can't do; its old version stays in its history.\nThe rows are the query's, so give no data. Give no config, background, padding, autosize or top-level title: the app decides the look, and the widget's name is the title (title.subtitle stays). About 800 wide in all, in numbers: width 720, height 320. Leave text colours to the theme. Not available: params, selections, url, href, the image and geoshape marks, and nested data. A fixed level line takes y: { datum: 80 }, and x: null under a shared x, or it draws one line per x. Formulas may call only simple functions (format, round, toDate, year and the like). Anything else, and any number people will quote, belongs in the query, so it reads the same in every view. sort: null keeps the query's order.\nTo read well: say the finding in the name or subtitle, with its number, or, on a chart that refreshes, in a text mark worked out from the rows, since typed words go stale; a mid grey plus one accent colour, mid-tones that read on a light and a dark card, more only where they mean something; a target or limit on the chart as a labelled mark; values on the marks or an axis, not both; label only the points the finding rests on; bars start at zero.\nExample: { \"width\": 720, \"height\": 320, \"encoding\": { \"x\": { \"field\": \"month\", \"type\": \"temporal\" } }, \"layer\": [ { \"mark\": { \"type\": \"bar\", \"color\": \"#94a3b8\" }, \"encoding\": { \"y\": { \"field\": \"orders\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"line\", \"color\": \"#3b82f6\" }, \"encoding\": { \"y\": { \"field\": \"avg_3m\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"rule\", \"strokeDash\": [4, 4] }, \"encoding\": { \"x\": null, \"y\": { \"datum\": 500 } } } ] }"New value: +"A Vega-Lite v6 description, only for a chart chartType can't say: several panels, several kinds of mark on one chart, bands, shaded periods, labelled lines, a log or reversed axis, a colour per row, floating bars, side-by-side boxplots. A plain bar, line or pie stays chartType: it is shorter, follows the dashboard's Day/Week/Month switch, and a person can edit it by hand, which nobody can do to this. Rebuild an existing chart this way only when asked for something its type can't do; its old version stays in its history.\nThe rows are the query's, so give no data. Give no config, background, padding, autosize or top-level title: the app decides the look, and the widget's name is the title (title.subtitle stays). About 800 wide in all, in numbers: width 720, height 320. Leave text colours to the theme. Not available: params, selections, url, href, the image and geoshape marks, and nested data. A fixed level line takes y: { datum: 80 }, and x: null under a shared x, or it draws one line per x. Formulas may call only simple functions (format, round, toDate, year and the like). Anything else, and any number people will quote, belongs in the query, so it reads the same in every view. sort: null keeps the query's order.\nTo read well: say the finding in the name or subtitle, with its number, or, on a chart that refreshes, in a text mark worked out from the rows, since typed words go stale; a mid grey plus one accent colour, mid-tones that read on a light and a dark card, more only where they mean something; a target or limit on the chart as a labelled mark; values on the marks or an axis, not both; label only the points the finding rests on; bars start at zero. On a chart that refreshes, keep words and legends off the plot, where a later bar can land on them: a legend with orient \"top\", a text mark with y: -6 and baseline \"bottom\".\nExample: { \"width\": 720, \"height\": 320, \"encoding\": { \"x\": { \"field\": \"month\", \"type\": \"temporal\" } }, \"layer\": [ { \"mark\": { \"type\": \"bar\", \"color\": \"#94a3b8\" }, \"encoding\": { \"y\": { \"field\": \"orders\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"line\", \"color\": \"#3b82f6\" }, \"encoding\": { \"y\": { \"field\": \"avg_3m\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"rule\", \"strokeDash\": [4, 4] }, \"encoding\": { \"x\": null, \"y\": { \"datum\": 500 } } } ] }"
  2. Changed3 schema fields changed
    • addedInput schema / properties / changeNote
      Added value: +{
      +  "description": "For a Vega-Lite chart: what this change does and why, in a few words. People read it in Chart history.",
      +  "maxLength": 200,
      +  "type": "string"
      +}
    • addedInput schema / properties / restoreRevision
      Added value: +{
      +  "description": "For a chart with a history: bring back this version, from chartHistoryNotes (fastero_get_report). Restoring is a change too, so it can be undone.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / vegaLite
      Added value: +{
      +  "description": "A Vega-Lite v6 description, only for a chart chartType can't say: several panels, several kinds of mark on one chart, bands, shaded periods, labelled lines, a log or reversed axis, a colour per row, floating bars, side-by-side boxplots. A plain bar, line or pie stays chartType: it is shorter, follows the dashboard's Day/Week/Month switch, and a person can edit it by hand, which nobody can do to this. Rebuild an existing chart this way only when asked for something its type can't do; its old version stays in its history.\nThe rows are the query's, so give no data. Give no config, background, padding, autosize or top-level title: the app decides the look, and the widget's name is the title (title.subtitle stays). About 800 wide in all, in numbers: width 720, height 320. Leave text colours to the theme. Not available: params, selections, url, href, the image and geoshape marks, and nested data. A fixed level line takes y: { datum: 80 }, and x: null under a shared x, or it draws one line per x. Formulas may call only simple functions (format, round, toDate, year and the like). Anything else, and any number people will quote, belongs in the query, so it reads the same in every view. sort: null keeps the query's order.\nTo read well: say the finding in the name or subtitle, with its number, or, on a chart that refreshes, in a text mark worked out from the rows, since typed words go stale; a mid grey plus one accent colour, mid-tones that read on a light and a dark card, more only where they mean something; a target or limit on the chart as a labelled mark; values on the marks or an axis, not both; label only the points the finding rests on; bars start at zero.\nExample: { \"width\": 720, \"height\": 320, \"encoding\": { \"x\": { \"field\": \"month\", \"type\": \"temporal\" } }, \"layer\": [ { \"mark\": { \"type\": \"bar\", \"color\": \"#94a3b8\" }, \"encoding\": { \"y\": { \"field\": \"orders\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"line\", \"color\": \"#3b82f6\" }, \"encoding\": { \"y\": { \"field\": \"avg_3m\", \"type\": \"quantitative\" } } }, { \"mark\": { \"type\": \"rule\", \"strokeDash\": [4, 4] }, \"encoding\": { \"x\": null, \"y\": { \"datum\": 500 } } } ] }",
      +  "type": "object"
      +}
  3. Changed4 schema fields changed
    • changedInput schema / properties / assignments / description
      Previous value: -"Which result columns a chart plots, by chart type: bar, horizontal_bar, stacked_bar {category, value_slot_1, value_slot_2...}; line {xAxis, yAxis}; time_series {date, yAxis1, optional yAxis2}; pie {category, value}; scatter {xAxis, yAxis}; waterfall {category, value}; combo {category, bar_value, line_value}; heatmap {xAxis, yAxis, value}; treemap {name, value}; bubble {xAxis, yAxis, size, optional category}; map {latitude, longitude, optional size, category, label}. Values are column names from the query result. Write the query to return one row per point (aggregate in SQL)."New value: +"Which result columns a chart plots, by chart type: bar, horizontal_bar, stacked_bar {category, value_slot_1, value_slot_2...}; line {xAxis, yAxis, optional value_slot_2, value_slot_3...} (a line each); time_series {date, yAxis1, optional yAxis2}; pie {category, value}; scatter {xAxis, yAxis}; waterfall {category, value}; combo {category, bar_value, line_value}; heatmap {xAxis, yAxis, value}; treemap {name, value}; bubble {xAxis, yAxis, size, optional category}; map {latitude, longitude, optional size, category, label}. Values are column names from the query result. Write the query to return one row per point (aggregate in SQL)."
    • addedInput schema / properties / colors
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "A colour for each category value the chart draws, say { \"East\": \"#22c55e\" }: that bar, slice or tile in it (#rrggbb, #rgb or rgb(r, g, b)). Values left out keep the chart's own colours; on an update the map replaces the chart's, and {} removes it.",
      +  "type": "object"
      +}
    • addedInput schema / properties / referenceLines
      Added value: +{
      +  "description": "Lines and bands drawn across a bar, horizontal_bar, stacked_bar, line, time_series, combo or scatter chart: { type: \"average\" } a dashed line at the average of the points drawn; { type: \"value\", value } a line at a fixed value, such as a target; { type: \"band\", from, to } a shaded range. Each may have a label and a color (#rrggbb, #rgb or rgb(r, g, b)). The list replaces the chart's; [] removes them.",
      +  "items": {
      +    "properties": {
      +      "color": {
      +        "type": "string"
      +      },
      +      "from": {
      +        "type": "number"
      +      },
      +      "label": {
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "to": {
      +        "type": "number"
      +      },
      +      "type": {
      +        "enum": [
      +          "average",
      +          "value",
      +          "band"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 5,
      +  "type": "array"
      +}
    • addedInput schema / properties / sortOrder
      Added value: +{
      +  "description": "The order a bar, horizontal_bar, pie or waterfall chart draws its categories in: by value, smallest first (asc) or largest first (desc), or as the query returns them (none, the default). A horizontal_bar reads desc from the top.",
      +  "enum": [
      +    "none",
      +    "asc",
      +    "desc"
      +  ],
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • changedInput schema / properties / chartType / description
      Previous value: -"Same values as fastero_create_report."New value: +"Same values as fastero_create_report; give the assignments that chart needs with it."
    • addedInput schema / properties / name / description
      Added value: +"A new name, the title people see above the chart."
  5. Changed2 schema fields changed
    • addedInput schema / properties / projectId / description
      Added value: +"The project’s id, from fastero_list_projects."
    • addedInput schema / properties / reportId / description
      Added value: +"A report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard."
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare a destructive, idempotent write; the description goes far beyond that, disclosing that replaced content is not kept except on Vega-Lite charts, that 20 revisions are recoverable via restoreRevision, that omitted fields are preserved, and what the call returns. This is exactly the extra context the annotations cannot carry.

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?

Front-loaded with the core operation and mutation semantics before the alternatives and permissions. The prose is dense and slightly run-on (the list of settings is packed into one clause), but every sentence carries decision-relevant information, so little is wasted.

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

Completeness5/5

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

For a 22-parameter mutation with nested objects and no output schema, the description covers permissions, non-recoverable overwrite behavior, revision restore, refusal conditions, sibling routing and the return value. An agent has what it needs to call this correctly and defensively.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real cross-parameter semantics: 'fields left out stay as they are', each setting changes only itself while keeping others, and 'assignments sent without chartType replace the old ones unchecked'. These resolve ambiguities the schema cannot express; only the per-parameter detail overlaps the schema.

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?

States a specific verb and resource ('Change a report (a dashboard widget) in place') and enumerates exactly what can be changed: name/description, drawing, display settings, text block. It is immediately distinguishable from fastero_create_report, fastero_update_query and fastero_update_dashboard, each named in context.

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?

Explicitly routes to alternatives with conditions: use fastero_update_query to change the SQL, fastero_create_report to add another view, fastero_update_dashboard to move it. It also states when the tool refuses input (chartType without its columns, text for a non-text-block) and who may call it (owners/admins/editors, plus access-list rules).

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.