Skip to main content
Glama

Server Details

Query your databases and build dashboards, Streamlit apps and reports your team logs in to.

Ownership verified
Status
Healthy
Uptime
96.3% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
Repository
fastero/fastero-mcp
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A4/5.0

Scored across 95 tools

Disambiguation3/5

Within each resource family the descriptions carefully cross-reference siblings, but the set is so large that several families genuinely overlap: schedules vs triggers (different tools for each), create_report vs save_chart vs show_chart vs show_report, and three near-identical 'create X' project types plus three 'run X' tools. An agent can usually pick correctly by reading the long descriptions, but the cost of choosing is high and mistakes (e.g. set_schedule_enabled on a trigger, or a trigger tool on an alert) are easy.

Naming Consistency4/5

Nearly all tools follow fastero_verb_noun in snake_case with a shared prefix, and verbs (create/get/list/update/delete/run/set) are applied consistently per resource. Minor deviations exist: fastero_invite_to_project vs fastero_cancel_project_invite, schedule used as a verb (fastero_schedule_notebook) alongside set_python_schedule, and fastero_ensure_python_entrypoint / fastero_pin_notebook_cell sitting outside the CRUD pattern.

Tool Count2/5

95 tools is far past the point where an agent can hold the surface in mind, even granted that Fastero covers a dozen real resources (connections, queries, reports, dashboards, pages, notebooks, Python projects, Streamlit apps, files, secrets, schedules, triggers, definitions, sharing). Several tools could be collapsed or merged (show_chart/save_chart, create_report/save_chart, the three run_* tools, the three create_*project tools), so the count reflects sprawl as much as domain breadth.

Completeness4/5

Coverage is unusually thorough: full CRUD plus run/publish/share for almost every resource, with explicit lifecycle tools for schedules, triggers, invites and secrets. Gaps are minor: no update_connection or update_secret-for-files, no delete_secret, no get_alert or delete/update for alerts (only creation and enable/disable via schedules), and no project-level create/update. These are workarounds rather than dead ends.

Available Tools

95 tools
fastero_cancel_project_inviteCancel project inviteA
DestructiveIdempotent
Inspect

Cancel an open invite: an emailed one, whose link then stops working, or one awaiting confirmation, which is then never sent. Nothing is emailed either way. Use it to withdraw an invite to a wrong or unwanted address; it cannot remove someone who has already accepted. Needs an Owner or Admin role in the project. An invite already accepted or cancelled is refused (400). Returns { message: 'Invite cancelled' }.

NameRequiredDescriptionDefault
inviteIdYesThe invite to cancel: an _id from fastero_list_project_invites, or the inviteId fastero_invite_to_project returned.
projectIdYesThe project the invite is for: its id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructive=true, idempotent=true), it discloses concrete effects: the emailed link stops working, pending invites are never sent, and nothing is emailed either way. It also names the 400 refusal case for already-accepted/cancelled invites and states the return shape, which the annotations alone cannot convey.

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

Conciseness5/5

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

Front-loads the core action and effect, then prerequisites and error behavior. Three compact sentences, each carrying distinct information with no redundancy.

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?

There is no output schema, but the description supplies the return value ({ message: 'Invite cancelled' }), the side effects, the auth requirement, and the failure mode. For a two-parameter destructive tool, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, including the inviteId source (_id from list_project_invites or the inviteId from invite_to_project). The description adds only marginal framing about which invite states are eligible; baseline 3 applies when the schema does the heavy lifting.

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 ('Cancel') and resource ('project invite'), and immediately disambiguates the two invite states (emailed link vs. awaiting confirmation). This clearly separates it from fastero_invite_to_project and fastero_list_project_invites.

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 gives the use case ('withdraw an invite to a wrong or unwanted address') and the hard exclusion ('it cannot remove someone who has already accepted'). It also adds necessary prerequisites ('Owner or Admin role') and the refused-state condition (already accepted/cancelled returns 400), leaving nothing to inference.

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

fastero_create_alertCreate alertA
Destructive
Inspect

Watch one number from a saved query and email when it crosses a line. On each run the query executes; the alert reads column from its first row (or the first numeric column when none is named) and compares it with value using op (gt, gte, lt, lte). It emails when the number crosses, again when it comes back, and once if the check starts failing — staying across the line sends nothing. Recipients must be members of the organisation; with none given it emails you. The cadence is at most once an hour, in the timezone given. The same query and condition asked again updates the timetable and recipients. fastero_set_schedule_enabled switches it off.

NameRequiredDescriptionDefault
opYes
valueYes
columnNoColumn read from the query's first row.
emailsNo
cadenceYesFive-field cron (minute hour day-of-month month day-of-week), at most once an hour, read in `timezone`. '0 9 * * 1' is 09:00 every Monday; '0 8 1 * *' is 08:00 on the 1st of each month.
queryIdYesA saved query’s id, from fastero_list_queries.
timezoneYesIANA timezone the cadence is read in, e.g. 'Europe/Berlin' or 'America/New_York'.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false and destructiveHint=true; the description adds rich behavior beyond that: emails on crossing, again on return, once if the check starts failing, silence while staying across the line, org-member recipient constraint, default-to-self, at-most-hourly cadence, and upsert-on-repeat (which explains the destructive overwrite hint). This is exactly the extra context 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.

Conciseness5/5

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

Dense but every clause is load-bearing — purpose is front-loaded, then semantics, recipients, cadence, upsert, and the disable sibling. No filler or repetition.

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?

With no output schema, the description fully carries the burden: it explains trigger conditions, email behavior, recipient rules, cadence limits, and update behavior. An agent can call it correctly without further inference.

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 63%, and the description compensates meaningfully: it defines the column fallback ('first numeric column when none is named'), the op comparison set, the default recipient behavior, and cadence/timezone reading. projectId and queryId are left to their schema descriptions, so not a full 5.

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

Purpose5/5

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

States a specific verb+resource and scope: 'Watch one number from a saved query and email when it crosses a line.' It clearly separates itself from sibling creation tools (create_query, create_report, create_dashboard) by naming the alerting/threshold behavior.

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

Usage Guidelines4/5

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

Gives clear usage context — it executes a saved query on each run, and 'The same query and condition asked again updates the timetable and recipients' defines upsert semantics. It also names the alternative fastero_set_schedule_enabled for switching off. No explicit when-not-to-use beyond that, so a 4 rather than 5.

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

fastero_create_connectionCreate connectionAInspect

Create a data connection to a database that signs in with a username and password (Postgres, MySQL, SQL Server, Redshift, Snowflake, Oracle), available to the whole organisation. The credentials given in creds, the password among them, pass through the model and are kept in plain text in the client session transcript, so creating a direct-credential connection in the Fastero web app is the preferred route. OAuth sources such as BigQuery and Google Sheets cannot be created this way and need a browser sign-in; an uploaded CSV or Excel file becomes a connection with fastero_create_file_connection. It connects before saving, so a database it cannot reach is not saved. The refusal names a common cause, such as a wrong password, an unknown host or Oracle service, or a firewall that needs Fastero's address allowed; any other gives the driver's error code and the settings to check. For a Postgres, MySQL, SQL Server, Redshift or Oracle database behind an SSH bastion, creds also takes sshHost, sshPort (22), sshUsername, sshKeyId from fastero_create_ssh_key, and sshHostKey; host is then the database's host as the bastion reaches it, and for Oracle its IP address. A first call without sshHostKey is refused with the bastion's host-key fingerprint, which the person can compare on the bastion; the same call with it as sshHostKey goes ahead. Returns the new connection's _id, the connectionId other tools take. Owners, admins and editors of the organisation can create one.

NameRequiredDescriptionDefault
nameYesThe connection’s name, as people will see it in Fastero.
credsYesCredential fields for the datasource. For SQL: host, port, database, username (not "user"), password, sslMode ("require" for TLS). For SQL Server also encrypt (true or false; on by default for an Azure SQL host). For Oracle, service (the service name, such as ORCLPDB1) in place of database. For Snowflake: account, username, password, warehouse and database.
projectIdNoNot needed: the connection belongs to the whole organisation whichever project is named here (a project’s id, from fastero_list_projects).
datasourceYesDatasource key: pg (not "postgres"), mysql, mysql2, mssql, redshift, snowflake, oracle.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations only cover the readOnly/destructive profile, and the description carries the rest itself: credentials pass through the model and persist in plain text in the session transcript, the connection is tested before saving so unreachable databases are not persisted, refusal messages name a cause, and permission is limited to owners/admins/editors. The only shortfall is that the SSH host-key refusal flow is described at length while nothing is said about other failure modes such as duplicate names or credential rotation.

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 purpose, then exclusions, then the failure/test-before-save behaviour, then SSH, then the return value and permissions — a sensible order. It is a dense single block of roughly 250 words with the SSH edge case consuming nearly a third of it; readable but the wall-of-text format costs it a point.

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?

No output schema exists, so the description supplies the return contract itself ('the new connection's _id, the connectionId other tools take'). Combined with the mutation side effects, prerequisite tools, permission scope and error semantics, an agent has everything needed to invoke this correctly on the first try.

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?

Schema coverage is already 100%, so a 3 would be the floor, but the description goes well beyond it: it documents the nested creds fields for bastion access (sshHost, sshPort with its default of 22, sshUsername, sshKeyId, sshHostKey), redefines what `host` means when a bastion is used (and that Oracle takes an IP address there), and explicitly neutralises projectId as not needed. That is real semantic value the schema does not supply.

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 ('Create a data connection to a database'), enumerates the supported datasources, and immediately distinguishes itself from the two nearest siblings: OAuth sources (BigQuery, Google Sheets) that need a browser sign-in, and fastero_create_file_connection for uploaded CSV/Excel files. An agent can route correctly without opening any schema.

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?

Explicit when-to-use with the caveat that the web app is the preferred route because credentials land in the transcript, explicit when-not (OAuth sources, file uploads), and an explicit prerequisite chain for SSH (sshKeyId from fastero_create_ssh_key, host-key fingerprint verification). Exclusions and alternatives are both named.

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

fastero_create_dashboardCreate dashboardAInspect

Create an empty dashboard in a project, shared with everyone in the organization. Charts go on it through fastero_save_chart, which saves a query, makes its chart and places it in one step, or by placing existing reports with fastero_update_dashboard. Two dashboards may share a name. Returns the new dashboard with its _id and url, the page where a signed-in member opens it. An organization at its plan’s dashboard limit is refused, with a message that says so.

NameRequiredDescriptionDefault
nameYesThe dashboard’s name, as people will see it.
projectIdYesThe project’s id, from fastero_list_projects.
descriptionNoOptional: what the dashboard is for.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the organization-wide sharing side effect, that names are non-unique, the returned payload (_id and url), and the plan-limit failure mode with its error message. That is exactly the mutation-consequence context annotations alone (readOnlyHint=false, destructiveHint=false) cannot convey.

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?

Four sentences, front-loaded with the action and scope, then workflow, then return value, then failure mode. Each sentence earns its place, though the workflow sentence is densely packed and could be split for scanning.

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?

With no output schema, the description supplies the return shape itself, and for a mutating create tool it covers side effects, naming rules, follow-up tools, and the quota failure. An agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema coverage is 100%, so the three parameters are already documented, including projectId's source. The description adds one genuinely new constraint, that two dashboards may share a name, but nothing about the optional description field or format expectations. Baseline 3 fits.

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 ('Create an empty dashboard in a project') plus the scope of who sees it. The word 'empty' plus the pointer to fastero_save_chart / fastero_update_dashboard for populating it separates this cleanly from fastero_create_report, fastero_create_page and the other create_* siblings.

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

Usage Guidelines4/5

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

Explains the workflow: create empty here, then add charts via fastero_save_chart or place existing reports via fastero_update_dashboard. It gives clear context for when this tool is the right entry point but does not state explicit exclusions or say when to prefer creating a report instead.

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

fastero_create_file_connectionMake file queryableAInspect

Make an uploaded CSV or Excel file queryable with SQL: a connection over the file, holding it as one table. Answers with connectionId and tableName. fastero_run_sql then runs SQL on it in DuckDB's dialect (SELECT * FROM "" LIMIT 10), fastero_list_connection_schemas lists its columns, and fastero_create_query or fastero_save_chart keeps a query on it for charts and dashboards. An Excel file gives one sheet: sheetName, else the first, and the answer names it. A file that already has a connection answers with that one (created: false), unless sheetName asks for a sheet it does not hold. The connection reads the latest upload of the file: after a file of the same name is uploaded again, its next query reads the new one. Any other file type is refused; a database is connected with fastero_create_connection instead. Owners, admins and editors of the project can make one.

NameRequiredDescriptionDefault
nameNoThe connection’s name. Defaults to "<file name> (file connection)".
fileIdYesAn uploaded file’s id, from fastero_list_files.
projectIdYesThe project’s id, from fastero_list_projects.
sheetNameNoFor an Excel file: the sheet to load. The first sheet when left out.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the non-readOnly, non-destructive annotations, the description discloses return values (connectionId, tableName), idempotency behavior (existing connection returns created: false unless sheetName differs), latest-upload read semantics, Excel sheet defaulting, file-type restrictions, and required project roles.

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

Conciseness5/5

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

The description is front-loaded with the core action and then layers in return values, workflow siblings, edge cases, and permissions. Every sentence carries operational information; there is no filler.

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?

Although there is no output schema, the description explains what the tool returns (connectionId and tableName), the idempotent created: false case, downstream querying, file-type refusal, Excel sheet selection, and permission requirements. That is enough for an agent to call it correctly without opening sibling schemas.

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 baseline is 3. The description adds context for sheetName by explaining that an Excel file yields one sheet and that an existing connection is returned unless sheetName requests a sheet it does not hold, which is behavioral meaning not present in 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?

The description opens with a specific verb and resource: it creates a SQL queryable connection over an uploaded CSV or Excel file, holding it as one table. It explicitly distinguishes this from fastero_create_connection, which is for databases, and names the sibling tools used on the resulting connection.

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?

It states when to use this tool (uploaded CSV/Excel files), when not to use it (any other file type is refused; databases use fastero_create_connection instead), and how to proceed afterward with fastero_run_sql, fastero_list_connection_schemas, fastero_create_query, and fastero_save_chart.

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

fastero_create_notebookCreate notebookAInspect

Create an empty notebook in a project, with no cells: a document of Python and SQL code cells and markdown, run top to bottom in a fresh kernel, that keeps each cell’s output beside its code. It suits analysis people read in place; fastero_write_notebook puts the cells in. For a job of .py files run as a script with its own log, fastero_create_python_project; for an app people open in the browser, fastero_create_streamlit_app. Two notebooks may share a title. Returns the notebook with its _id.

NameRequiredDescriptionDefault
nameYesThe notebook’s title.
projectIdYesThe project’s id, from fastero_list_projects.
descriptionNoOptional: what the notebook is for.

TDQS

A4.3/5.0
Behavior4/5

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

Adds behavior beyond the annotations: the created notebook is empty (no cells), duplicate titles are allowed ('Two notebooks may share a title'), and it returns the notebook including its _id. Annotations already cover the mutation/safety profile, so the remaining gap is only around permissions or project-existence requirements.

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-loads the action and the empty-notebook constraint, then routes to alternatives. The mid-sentence explanation of what a notebook is ('Python and SQL code cells and markdown, run top to bottom in a fresh kernel…') is definitional padding that a shorter clause could cover, though it does aid disambiguation.

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

Completeness4/5

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

Three params, full schema coverage, and the description supplies the return shape ('the notebook with its _id') even without an output schema, plus sibling routing. Only error/precondition behavior (e.g., what happens with an invalid projectId) is left unstated, which is a minor gap.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents name, projectId, and description; baseline is 3. The description adds one semantic fact about the name parameter (titles are not unique), but says nothing extra about projectId sourcing or the optional description.

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

Purpose5/5

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

Opens with a precise verb+resource+state: 'Create an empty notebook in a project, with no cells,' and immediately clarifies the resource is populated by fastero_write_notebook. An agent can distinguish it from write_notebook and from the project/app creation siblings without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit routing: use fastero_write_notebook to add cells, fastero_create_python_project for script-style .py jobs with logs, fastero_create_streamlit_app for browser apps. Both the when-to-use-this and the when-to-use-a-sibling conditions are stated.

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

fastero_create_pageCreate pageAInspect

Publish an HTML dashboard page to a project, where every member opens it with live numbers. A page is one HTML document that runs sealed off in a member's browser. It reads a widget's live rows with const { rows, lastUpdated, truncated } = await fastero.data("<name>"), being one of the names given in widgets, and redraws when fastero.onRefresh(fn) calls fn. It may load libraries only from https://cdnjs.cloudflare.com or https://cdn.jsdelivr.net; every other request, fetch and XHR included, is blocked. A link cannot leave the frame: fastero.open({ dashboard: "<dashboardId>" }) opens one of the dashboards of the project for the person reading. Read the numbers rather than writing them into the page, so it stays current. Lay it out to fit from about 600px wide, a card in Claude's chat, to a full screen in Fastero: let tiles wrap, and give flex items that hold charts min-width: 0. Returns the page without its HTML, with url, the page's address. fastero_show_page shows it in the conversation.

NameRequiredDescriptionDefault
htmlYesThe whole HTML document, at most 2 MB.
nameYesThe page’s name, as members see it; at most 200 characters.
widgetsYesThe widgets the page may read, each under the name its code asks for: widgets of this project of type query, file or notebook (fastero_list_reports lists them). One of type integration is refused; a text block, though of type file, is accepted and gives the page no rows.
projectIdYesThe project’s id, from fastero_list_projects.
noteEnabledNoFastero writes a short AI note about the page's numbers above it. false turns it off, for a page with text of its own.

TDQS

A4.3/5.0
Behavior5/5

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

Goes well past the annotations (readOnlyHint=false, destructiveHint=false): it documents the sandbox contract (CDN allowlist of cdnjs.cloudflare.com and cdn.jsdelivr.net, all other fetches/XHR blocked), the in-page runtime API (fastero.data, fastero.onRefresh, fastero.open), and the return value ('the page without its HTML, with url'). That is substantial behavioral context an agent cannot get from the structured fields.

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

Conciseness4/5

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

Purpose and return value are front-loaded and the paragraph is dense with non-redundant detail. A few clauses (the min-width: 0 / tile-wrapping layout tip, the open({dashboard}) aside) sit closer to authoring advice than tool selection, so it is busy but not padded.

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

Completeness4/5

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

No output schema exists, and the description compensates by stating what is returned (page object without HTML, plus url) and how to surface it (fastero_show_page). With 5 parameters and thin annotations, the remaining gap is edit/overwrite and failure behavior — e.g., what happens if the name already exists or when the excluded 'integration' widget type is supplied (the latter is only covered in the schema).

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 baseline is 3, and the description earns an extra point by explaining the coupling between the `widgets` parameter and page code — `<name>` in `fastero.data("<name>")` must match a name given in widgets. The layout advice ('fit from about 600px wide... give flex items that hold charts min-width: 0') also adds meaning about expected HTML content beyond the 2 MB limit in 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?

Opens with a specific verb and resource: 'Publish an HTML dashboard page to a project,' then defines what a page is ('one HTML document that runs sealed off in a member's browser'), which separates it from fastero_create_dashboard and fastero_create_streamlit_app without naming them. An agent knows exactly what artifact this produces.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: it asserts the page should 'read the numbers rather than writing them into the page' and points to fastero_show_page for displaying the result. It never says when to choose a page over a dashboard, streamlit app, or report, nor what prerequisites or naming/overwrite behavior apply, so the agent must infer tool selection.

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

fastero_create_python_projectCreate Python projectAInspect

Create a Python project: a workspace of .py files with entrypoints, each run as a script on a machine of its own, by hand or on a schedule, with its log kept and the files a run writes saved back. It suits repeatable jobs and report generators. sourceType 'local' (the default) starts it with main.py, .env.sample and README.md and an entrypoint 'main' that runs main.py, which fastero_write_python_file replaces. sourceType 'git' links a repository, read when its files are listed or it first runs; one that cannot be read without signing in (a private repository) needs its Git provider or token chosen, which is done in the Fastero app, so such a project is made there. A project linked here starts with no entrypoint, and fastero_ensure_python_entrypoint adds one; one linked in the Fastero app starts with one for each of its scripts. Two projects may share a name. Returns the project with its _id. For analysis read in place, fastero_create_notebook; for an app in the browser, fastero_create_streamlit_app.

NameRequiredDescriptionDefault
gitNoRequired when sourceType is 'git': { repoUrl, branch, subDirectory }. branch defaults to main; subDirectory is a folder inside the repository holding the code.
nameYesThe Python project’s name, as people will see it.
projectIdYesThe project’s id, from fastero_list_projects.
sourceTypeNo'local' for a workspace you write files into (the default), or 'git' to run code from a repository.
descriptionNoOptional: what it does.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false/destructiveHint=false; the description goes well beyond by disclosing exactly what gets created 'local' (main.py, .env.sample, README.md, an entrypoint 'main') versus 'git' (no entrypoint, repo read on listing or first run). It flags the private-repo auth prerequisite, notes duplicate names are allowed, and states the return value ('the project with its _id').

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?

Purpose and scope are front-loaded in the first sentence, and the closing sentence routes to siblings. Some phrasing is dense and meandering (the nested private-repository clause, 'each run as a script on a machine of its own'), and a few details are marginal, but no sentence is pure filler.

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 create tool with no output schema, the description covers the important ground: creation side effects, sourceType behavior, entrypoint lifecycle (fastero_ensure_python_entrypoint fills the gap for git-linked projects), auth prerequisites, and the returned identifier. An agent has everything needed to call it correctly.

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 schema already documents all five parameters, making 3 the baseline. The description adds real semantics beyond the schema, though: it states 'local' is the default, what the git object's values trigger (repo read on file listing or first run), and the entrypoint consequences of each sourceType. The remaining parameters (name, description, projectId) get no extra treatment, so it is not a 5.

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

Purpose5/5

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

Names a specific verb and resource ('Create a Python project') and immediately defines what that resource is: a workspace of .py files with entrypoints, run on its own machine, manually or scheduled. It explicitly distinguishes itself from the sibling creation tools (fastero_create_notebook for in-place analysis, fastero_create_streamlit_app for browser apps) so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

Gives concrete fit criteria ('suits repeatable jobs and report generators') plus explicit alternatives with their selection conditions. It also states a hard exclusion: private git repositories require provider/token setup in the Fastero app, so such projects cannot be created through this tool in that case.

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

fastero_create_queryCreate saved queryAInspect

Save a new SQL query against a connection so it can be scheduled, shared or turned into a report. The SQL is saved, not run; as with fastero_run_sql it must be read-only, and a statement that could change data is refused. Two queries may share a name. Returns the query with its _id, the queryId fastero_create_report and fastero_create_alert take; starting a chart from SQL, fastero_save_chart saves the query and the chart in one call. Where the query computes a business number, fastero_get_definitions holds this organisation's own expression for it, and definitionsUsed records which definitions the query was built from, with their version.

NameRequiredDescriptionDefault
sqlYesThe SQL text, in the connection’s own dialect.
nameYesThe query’s name, as people will see it.
projectIdYesThe project’s id, from fastero_list_projects.
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.
definitionsUsedNoNames of the shared definitions (metrics, datasets) the SQL was built from.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations only declare the write shape (readOnlyHint=false, destructiveHint=false); the description adds real behavioral context: the SQL is persisted not executed, it must be read-only or the call is rejected, and duplicate names are permitted. It also describes the return value (_id/queryId), which matters since there is no output schema. Slightly short of 5 as it omits error/permission behavior beyond the read-only check.

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?

Purpose is front-loaded in the first sentence and the saved-not-run distinction follows immediately. The paragraph is dense and the closing definitions sentence is somewhat tangential, but every sentence carries usable routing or behavioral 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?

With no output schema, the description compensates by naming the returned _id/queryId and which siblings consume it. Validation rules, duplicate-name tolerance, and related tools are all covered, so an agent has enough to invoke it correctly.

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 a 3 baseline would suffice, but the description adds semantic value by explaining that definitionsUsed records which shared definitions and versions the query was built from and tying it to fastero_get_definitions. That goes beyond the schema's terse field 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?

States a specific verb and resource ("Save a new SQL query against a connection") plus the downstream purposes (scheduling, sharing, reports). Explicitly distinguishes itself from fastero_run_sql ("The SQL is saved, not run"), so an agent can pick it without opening a schema.

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

Usage Guidelines5/5

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

Gives clear when-to-use routing: use fastero_run_sql to execute, fastero_save_chart when you want the query and chart together, and references that fastero_create_report/create_alert consume the returned queryId. Also states a when-not: SQL that could change data is refused.

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

fastero_create_reportCreate reportAInspect

Create a report (a dashboard widget) from a saved query: a table, a number, a map or a chart. A chart or map needs assignments naming the result columns it plots, or it is refused. For a chart chartType can’t say, vegaLite instead of chartType and assignments. Column names become the labels people read, so alias them in SQL as they should appear ("Revenue", not revenue_sum). Or a text block: chartType text with text, a heading or note in markdown that sits between charts; it reads no query. fastero_update_dashboard places it on a dashboard. Returns the report with its _id and url, the chart’s own page. Starting from SQL, fastero_save_chart saves the query, makes the chart and places it in one call.

NameRequiredDescriptionDefault
nameYes
textNoFor chartType text: the heading or note, in markdown (## for a heading). Up to 5,000 characters.
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".
queryIdNoA saved query’s id, from fastero_list_queries.
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.
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 } } } ] }
chartTypeNobar, horizontal_bar, stacked_bar, line, time_series, pie, scatter, waterfall, combo, heatmap, treemap, bubble for a chart (with assignments); or table; or number, a number card, which over a series (assignments { date, value }, one row per period) shows the latest value, its change against the previous period and a trend line; or map (assignments { latitude, longitude }); or kpi, gauge, scorecard, summary; or text for a text block. Defaults to table. line or time_series for a measure over time; bar to compare categories (horizontal_bar for long labels, stacked_bar for the parts of each); pie or treemap for shares of one whole (a pie shows the 7 largest slices and groups the rest as Other); waterfall for steps that add up to a total; combo for two measures on different scales; scatter to relate two measures, bubble for three; heatmap for one measure across two categories.
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.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses validation behavior (a chart or map without assignments is refused), return values (the report with _id and url), and placement behavior via fastero_update_dashboard. It also explains that text blocks read no query and that vegaLite charts have editing and history constraints.

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

Conciseness5/5

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

The description is front-loaded with the core action and supported report types, then adds the key constraints and alternatives. Despite the tool's complexity, every sentence carries actionable information and there is no filler.

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 21-parameter creation tool with no output schema, the description covers the essential call shape, validation rules, return value, and sibling alternatives. The detailed input schema supplies the remaining parameter-level detail, so the description is complete enough for correct selection and invocation.

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 95%, so most parameter meaning is already documented. The description still adds cross-parameter semantics: chart and map assignments are mandatory, vegaLite replaces chartType and assignments for unsupported charts, text uses the text field, and SQL column aliases become visible labels.

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 description states a specific verb and resource: create a report, defined as a dashboard widget, from a saved query. It enumerates the supported report kinds (table, number, map, chart, text block) and distinguishes the tool from fastero_update_dashboard and fastero_save_chart.

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?

It gives explicit conditions: charts and maps require assignments or are refused; when chartType cannot express the chart, use vegaLite instead of chartType and assignments; text blocks use chartType text and read no query. It also names fastero_update_dashboard for placement and fastero_save_chart for the one-call SQL-to-dashboard path.

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

fastero_create_secretCreate secretAInspect

Create a text Secret: a named value that Python runs, notebooks and Streamlit apps read as an environment variable of that name. Give projectId to set it for one project, or omit it to set it for the whole organization; a project Secret overrides an organization Secret of the same name. A name already used at that level is refused, and so is one a config variable there uses: fastero_update_secret replaces a value, by the id fastero_list_secrets gives. Only organization owners and admins can set Secrets. Returns message and secret: its _id, name and type, who created it and when, never its value, which no tool returns, though a run’s own code can print it. The value passes through the model and is kept in plain text in the client session transcript.

NameRequiredDescriptionDefault
nameYesEnvironment variable name, e.g. DB_PASSWORD.
valueYesThe value. Write-only.
projectIdNoThe project to set it for, by its id from fastero_list_projects. Omit it to set it for the whole organization.

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses permission requirements ('Only organization owners and admins'), name-collision refusal, project-level override behavior, and the important security fact that the value is never returned by any tool and is kept in plain text in the client transcript. The annotations say readOnly=false and destructive=false, which the description is consistent with: this creates a new secret rather than reading or destructively modifying existing data.

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 dense but front-loaded: it defines the resource first, then scoping, then collision/alternative behavior, then permission and return semantics. Every sentence carries operational or safety information, though the single long paragraph could be easier to scan if split.

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 three-parameter creation tool with no output schema, the description covers scope, override behavior, permissions, failure conditions, return shape, and the unusual value-handling/security caveat. An agent has enough information to decide whether to call this tool and what to expect.

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 already 100%, so the baseline is 3, but the description adds meaning beyond the schema: projectId omission scopes the secret to the whole organization, project-level secrets override same-named organization secrets, and duplicate names at the same level are refused. It also reinforces that value is write-only and never returned.

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 description opens with a specific verb and resource ('Create a text Secret') and immediately defines what a Secret is and how it is consumed. It distinguishes creation from replacement by naming fastero_update_secret and mentions fastero_list_secrets as the way to find ids, so an agent can separate it from sibling tools.

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?

It explicitly states the project-vs-organization scoping choice via projectId and the override rule. It also names the alternative for replacing an existing value (fastero_update_secret) and the discovery tool for ids (fastero_list_secrets), leaving little to infer.

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

fastero_create_ssh_keyGet an SSH key for a connectionAInspect

Get the SSH key for a new connection to a database behind an SSH bastion (jump host), before fastero_create_connection; a database Fastero reaches directly needs none. Fastero makes one Ed25519 key per connection and keeps its private half. Returns sshKeyId, the public key (sshPublicKey) and, when host and port are given, authorizedKeysLine: the line for the SSH user's ~/.ssh/authorized_keys on the bastion, which lets the key reach only that database through the bastion and nothing else. fastero_create_connection then takes the sshKeyId in creds. The same key comes back until a connection uses it or a week has passed. Owners, admins and editors of the organisation can get one.

NameRequiredDescriptionDefault
hostNoThe database's host as the bastion reaches it, to fill in the line; a private address or an internal name is fine. For Oracle, its IP address.
portNoThe database's port, to fill in the line.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that an Ed25519 key is generated per connection with the private half retained server-side, that keys are cached ('same key comes back until a connection uses it or a week has passed'), that authorizedKeysLine is only produced when host and port are supplied, and the permission model ('Owners, admins and editors'). readOnlyHint=false is consistent with key generation, so no contradiction.

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

Conciseness5/5

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

The purpose and the sibling relationship are front-loaded in the first clause, followed by return values, caching behavior, and permissions in a logical order. Every sentence carries a distinct fact — no filler or restated title text.

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?

There is no output schema, and the description fully compensates by naming all three returned fields and explaining when authorizedKeysLine appears. Combined with the caching window and role requirements, an agent has everything needed to call this correctly and to sequence it with fastero_create_connection.

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 baseline would be 3, but the description adds semantics the schema does not: host and port are optional and exist solely to fill in authorizedKeysLine, and are therefore unnecessary if the caller only needs the key. That is a real behavioral consequence of the parameter values, not a restatement.

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 ('Get the SSH key') scoped to 'a new connection to a database behind an SSH bastion (jump host)'. It also names the adjacent sibling (fastero_create_connection) and the condition that removes the need for this tool ('a database Fastero reaches directly needs none'), so an agent can distinguish it without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit ordering ('before fastero_create_connection'), an explicit exclusion ('a database Fastero reaches directly needs none'), and the downstream handoff ('fastero_create_connection then takes the sshKeyId in creds'). When, when-not, and how it chains are all stated.

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

fastero_create_streamlit_appCreate Streamlit appAInspect

Create a Streamlit app in a project from the files given: a Python web app that signed-in project members open in the browser. It is created stopped; fastero_run_streamlit_app starts it, as does a project member opening its link. The platform runs the top-level app.py, so include it, with a requirements.txt for extra packages. To change an existing app, fastero_write_streamlit_file changes one file and fastero_replace_streamlit_files all of them; for analysis read in place, fastero_create_notebook; for a script run on a schedule, fastero_create_python_project. Two apps may share a name. Returns appId, status, viewerUrl (the page a signed-in project member opens) and its other settings, without the files. Owners, admins and editors of the project can create one.

NameRequiredDescriptionDefault
nameYesThe app’s name, as people will see it.
filesYesThe app's files. Each is { name, content, path? }: name has no slashes, path is the folder inside the app ('.' — the default — for the top level). The platform always runs app.py at the top level, so include it; add requirements.txt for extra packages.
projectIdYesThe project’s id, from fastero_list_projects.
descriptionNoOptional: what the app is for.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the write-but-non-destructive profile is already structured. The description adds real context beyond that: the app is created stopped, two apps may share a name, and owners/admins/editors are the roles that may create one. Return contents are described too.

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 what the tool creates, then behavior, then sibling routing; every sentence carries either a constraint or a routing decision. It is dense and long-ish for a single paragraph, but no sentence is filler.

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?

No output schema exists, and the description compensates by naming the returned fields (appId, status, viewerUrl, other settings, without files). Entrypoint constraints, permissions, and lifecycle are all covered, leaving nothing an agent needs missing.

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

Parameters3/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 and the schema already explains name, files, path and projectId. The description reinforces the app.py-at-top-level and requirements.txt constraints, but adds only one genuinely new semantic ('two apps may share a name') beyond 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 ('Create a Streamlit app in a project from the files given') and immediately defines the artifact as 'a Python web app that signed-in project members open in the browser', which separates it from notebooks and scheduled scripts. An agent can distinguish it from fastero_create_notebook and fastero_create_python_project without opening either schema.

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 by condition: fastero_write_streamlit_file to change one file, fastero_replace_streamlit_files to change all of them, fastero_create_notebook for in-place analysis, fastero_create_python_project for scheduled scripts. It also states the entry condition that fastero_run_streamlit_app (or a member opening the link) is what starts it, since creation leaves it stopped.

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

fastero_delete_connectionDelete connectionA
Destructive
Inspect

Delete a data connection for the whole organization; its owners, admins and editors can. Every saved query on it keeps its SQL but loses its connection, so the charts, dashboards and alerts built on those queries stop until each query is moved to another connection in the Fastero app, and the triggers that watch it are deleted with it. The database itself is not touched.

NameRequiredDescriptionDefault
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes well beyond that by enumerating the cascade: saved queries keep SQL but lose the connection, dependent charts/dashboards/alerts break, and watching triggers are deleted. The closing clarification 'the database itself is not touched' is exactly the kind of scope boundary an agent needs before confirming a destructive call.

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 verb, resource and audience, then the impact. The second sentence is a long run-on chaining three separate consequences, which slightly hurts scannability, but no clause is filler.

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 single-parameter destructive tool with no output schema, the definition covers permission gating, downstream effects, trigger deletion, and the explicit non-effect on the database. Nothing needed to call it safely is missing.

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

Parameters3/5

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

Only one parameter and schema coverage is 100%, with the schema itself explaining where the id comes from (fastero_list_connections, fastero_create_file_connection). The description adds nothing about connectionId, so baseline 3 applies.

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 ('Delete a data connection') plus the blast radius ('for the whole organization'), which no sibling delete tool shares. An agent can immediately tell this apart from fastero_delete_query, fastero_delete_dashboard, or fastero_delete_file.

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

Usage Guidelines4/5

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

Gives the permission precondition ('its owners, admins and editors can') and the consequences that inform a use/skip decision ('charts, dashboards and alerts ... stop until each query is moved'). It never names an explicit alternative or a 'do not use when' clause, so it falls short of a 5.

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

fastero_delete_dashboardDelete dashboardA
Destructive
Inspect

Delete a dashboard permanently, for everyone in the organization, not just you. Its public link stops working and its automatic refresh is switched off; an email schedule for it switches itself off the next time it comes due. The charts on it, and their saved queries, are kept: they stay in fastero_list_reports and on any other dashboard.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
dashboardIdYesA dashboard’s id, from fastero_list_dashboards.

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond the destructiveHint=true annotation by detailing the full consequence set: public link stops working, automatic refresh is switched off, and any email schedule disables itself at its next due time. It also clarifies what is NOT destroyed (charts and their saved queries survive, remaining in fastero_list_reports), which is exactly the kind of side-effect transparency a destructive tool needs.

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?

Two well-formed sentences, front-loaded with the permanent/org-wide scope before the side effects and retention notes. The second sentence is dense but every clause (link, refresh, schedule, retention) earns its place. Slightly long but no filler.

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 destructive mutation with no output schema, the description is complete: it covers permanence, scope, downstream effects, and data retention. An agent has everything needed to warn the user and call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (projectId, dashboardId) are documented with their source tools, so the schema carries the load. The description adds no syntax or format detail about the parameters themselves, making the baseline 3 appropriate.

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 (Delete) and resource (dashboard) and precisely scopes it as permanent and organization-wide ('not just you'), which separates it from the softer update_dashboard sibling. An agent can tell immediately what this does and its blast radius.

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

Usage Guidelines3/5

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

The description conveys the severity and permanence of the action, which implicitly signals when caution is warranted, but it never names an alternative tool or states explicit when-to-use/when-not conditions versus siblings like update_dashboard or delete_report. Usage is implied rather than spelled out.

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

fastero_delete_fileDelete project fileA
Destructive
Inspect

Delete an uploaded project file for everyone in the project; its contents are erased and cannot be restored. Dashboards built from it keep their charts, whose rows are stored with them, but can no longer be exported to Excel or recalculated from the file, and Fastero's assistant can no longer read it.

NameRequiredDescriptionDefault
fileIdYesAn uploaded file’s id, from fastero_list_files.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.3/5.0
Behavior5/5

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

Far exceeds what the annotations declare. Beyond destructiveHint=true, it explains that contents are erased irrecoverably, that dependent dashboards retain their charts (rows stored locally) but lose Excel export/recalculation and assistant readability. This downstream-impact detail is exactly the behavioral context annotations cannot express.

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

Conciseness5/5

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

The core action is front-loaded in the first clause, and every subsequent clause (irreversibility, dashboard impact, assistant access) carries non-redundant information. No filler.

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 2-parameter destructive mutation with no output schema, the description supplies the full consequence model: irreversibility, collateral impact on dashboards, and loss of programmatic access. Nothing an agent needs before calling it is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already document their source tools (fastero_list_files, fastero_list_projects). The description adds no additional parameter-level meaning, so the baseline 3 applies.

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 (delete) and a precisely scoped resource (an uploaded project file, for everyone in the project). The resource 'file' is clearly distinct from the other delete siblings (dashboard, notebook, query, report, page), so an agent can disambiguate without opening schemas.

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

Usage Guidelines3/5

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

The description conveys the scope and seriousness of the operation but never states when to choose this over an alternative (e.g., rename_file) or any prerequisite such as confirming the file is unused. Usage is implied by the destructive wording rather than made explicit.

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

fastero_delete_notebookDelete notebookA
Destructive
Inspect

Delete a notebook and the output saved in it, permanently, for everyone in the project. A schedule that runs it switches itself off the next time it comes due. To keep the notebook and stop only its scheduled runs, fastero_set_schedule_enabled switches the schedule off; fastero_write_notebook replaces its cells without deleting it.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true; the description adds the material consequences: destruction is permanent, affects everyone in the project, and any schedule running the notebook disables itself the next time it comes due. That cascade behavior is exactly what an agent needs and is not in the annotations.

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

Conciseness5/5

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

Three sentences, no filler: the destructive scope comes first, the schedule side effect second, and the alternatives last. Front-loading the permanence warning is the right ordering for a delete tool.

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 destructive tool with full annotation coverage and a complete parameter schema, this covers what remains: irreversibility, blast radius, side effects on schedules, and escape hatches. No output schema exists but none is needed for a delete.

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

Parameters3/5

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

Both parameters are fully documented in the schema (100% coverage), including where to obtain each id, so the description correctly leaves them alone. It adds no syntactic or format detail of its own, which is the expected baseline case.

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 (delete) and resource (notebook) with explicit scope: the output saved in it, permanently, for everyone in the project. It also names the two siblings an agent might confuse it with, so the tool is distinguishable without opening a schema.

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 the agent to alternatives: fastero_set_schedule_enabled when the notebook should be kept but scheduled runs stopped, and fastero_write_notebook when cells should be replaced. Both the when-to-use and the when-to-use-instead are stated.

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

fastero_delete_pageDelete pageA
Destructive
Inspect

Delete a hosted page (a dashboard is deleted with fastero_delete_dashboard). Its link stops working for everyone in the project, answering that the page was not found, and its automatic refresh stops. The widgets it read, and their queries and spreadsheets, are kept. To change what it shows and keep its link, fastero_update_page replaces its HTML in place. Answers with the page’s _id.

NameRequiredDescriptionDefault
pageIdYesA hosted page’s id, from fastero_list_pages.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructiveHint=true and readOnlyHint=false; the description goes well beyond by disclosing the exact blast radius: the link 404s for everyone in the project, auto-refresh stops, and widgets/queries/spreadsheets are preserved. It also states the returned _id, which matters since no output schema exists.

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

Conciseness5/5

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

Front-loaded with the action, then cascade effects, then the non-destructive alternative, then the return value. Every sentence carries distinct information and none is wasted despite the four-sentence length.

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 two-parameter destructive tool with no output schema, the definition covers action, side effects, preserved resources, the alternative path, and the return value. Nothing an agent needs to call it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the origin of both pageId and projectId is already documented in the schema. The description adds no format, constraint, or scoping detail beyond what the properties already say, so the baseline 3 applies.

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?

Starts with a specific verb+resource ('Delete a hosted page') and immediately disambiguates from the sibling 'fastero_delete_dashboard' by noting a dashboard deletion cascades to its page. An agent can distinguish this from get_page, update_page, delete_dashboard without opening any schema.

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 the agent: use fastero_delete_dashboard when the goal is the dashboard, and use fastero_update_page when the goal is to change content while preserving the link. The when-not condition (don't use this to edit) is stated outright.

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

fastero_delete_python_projectDelete Python projectA
Destructive
Inspect

Delete a Python project for everyone in the project: it leaves fastero_list_python_projects, its schedules are switched off, and it can no longer be run, scheduled or written to. Its stored files are erased and cannot be restored; its run history is kept.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, yet the description goes well beyond that by enumerating exact consequences: the project leaves fastero_list_python_projects, schedules are switched off, it can no longer be run/scheduled/written to. It also clearly separates irreversibly erased stored files from preserved run history, which is precisely the kind of detail an agent needs for a destructive call.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and scope, then the consequences in a single dense clause. No filler or repetition of the title.

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 destructive two-parameter tool with no output schema, everything needed to call it safely is present: scope, listed consequences, what is retained versus destroyed, and unrecoverability. No relevant gap remains.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already document their source (fastero_list_projects, fastero_list_python_projects). The description adds no additional meaning about the identifiers, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ("Delete a Python project") plus the blast radius ("for everyone in the project"), which is far stronger than the bare title. It doesn't explicitly contrast with sibling delete tools (delete_notebook, delete_streamlit_app), but the resource naming makes selection unambiguous.

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

Usage Guidelines3/5

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

Usage is implied by the operation type, but there is no explicit when/when-not guidance, e.g., that disabling schedules or triggers (set_schedule_enabled / disable_trigger) is the non-destructive alternative, or that a project that must remain runnable should not be deleted. The agent must infer the trade-off.

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

fastero_delete_queryDelete saved queryA
Destructive
Inspect

Delete a saved query for everyone in the project; it cannot be restored here. Reports built on it stay on their dashboards but are marked unavailable and draw nothing, and an alert on it switches itself off at its next check. fastero_list_reports shows which reports read it (their query).

NameRequiredDescriptionDefault
queryIdYesA saved query’s id, from fastero_list_queries.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the destructiveHint=true annotation by disclosing irreversibility ('cannot be restored here'), scope (affects everyone in the project), and downstream cascade effects: dependent reports stay but render nothing and are marked unavailable, and dependent alerts self-disable at their next check. This is exactly the behavioral context an agent needs before a destructive call.

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-loads the core action and irreversibility in the first clause, then adds consequences. Slightly dense in the second half (reports + alerts + cross-reference), but nearly every clause carries decision-relevant information.

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 destructive two-parameter mutation with annotations present and no output schema, the definition covers scope, irreversibility, and side effects on reports and alerts, plus where to inspect dependents. Nothing essential to calling it safely is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (queryId, projectId) and their provenance are already documented in the schema. The description adds no additional meaning about parameter format or constraints, so the baseline 3 applies.

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?

Specific verb (delete) plus resource (saved query) and explicit scope ('for everyone in the project'), which separates it from other delete siblings on dashboards, notebooks, pages, etc. An agent can distinguish it from fastero_update_query and fastero_get_query without opening schemas.

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

Usage Guidelines4/5

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

Clear context for when to call it and it routes the agent to fastero_list_reports to inspect dependents (and the schema points to fastero_list_queries for the id). It does not state an explicit when-not or a true alternative for removing a query, but the surrounding guidance is solid.

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

fastero_delete_reportDelete reportA
Destructive
Inspect

Delete a report permanently: it comes off every dashboard in the organization that places it, and those dashboards keep their other charts. The saved query it read is kept (fastero_delete_query deletes that). To take it off one dashboard only, fastero_update_dashboard with a layout that leaves it out.

NameRequiredDescriptionDefault
reportIdYesA report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond that by disclosing exactly what is destroyed and what is preserved: dashboards keep their other charts and the underlying saved query is retained. That is precisely the context an agent needs before committing an irreversible mutation.

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

Conciseness5/5

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

Three tight sentences, each earning its place: the core action, the preservation semantics, and the alternative route. The destructive scope is front-loaded ahead of the sibling pointers.

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?

No output schema is needed for a delete, and the description covers the safety profile, blast radius, and alternatives. Nothing required to call this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented with their sources (fastero_list_reports, fastero_get_dashboard, fastero_list_projects). The description adds no further parameter meaning, so the baseline 3 applies.

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 ('Delete a report permanently') and immediately scopes the blast radius (comes off every dashboard in the organization). It names two related siblings, fastero_delete_query and fastero_update_dashboard, so an agent can distinguish it from adjacent operations without opening schemas.

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 covers when to use it (permanent org-wide removal), what it does not do (the saved query survives), and the alternative path for a narrower intent ('To take it off one dashboard only, fastero_update_dashboard with a layout that leaves it out'). The routing decision is fully specified.

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

fastero_delete_streamlit_appDelete Streamlit appA
Destructive
Inspect

Delete a Streamlit app for everyone in the project: it leaves fastero_list_streamlit_apps, its server is stopped and its address stops working, and its saved packages, its Git token and the files fetched from its repository are removed. It cannot be restored here.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only say destructiveHint=true; the description adds concrete consequences: removal from listings, server stopped, address no longer resolves, and deletion of saved packages, the Git token, and repository-fetched files. It also states irreversibility and project-wide blast radius, which an agent needs before calling a destructive tool.

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

Conciseness5/5

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

A single sentence that front-loads the action and scope, then enumerates consequences in a scannable clause chain. No filler or restatement of the title.

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 two-parameter destructive tool with no output schema, the definition covers action, scope, side effects, irreversibility, and parameter provenance. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (appId, projectId) are documented with provenance in the schema itself. The description adds no format, constraint, or validation detail beyond that, so the baseline 3 applies.

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 (Delete) and resource (Streamlit app) plus an explicit scope qualifier: 'for everyone in the project'. That scope statement distinguishes it from narrower per-user or file-level operations among the many fastero_delete_* siblings.

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

Usage Guidelines4/5

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

Implicitly routes the agent by naming fastero_list_streamlit_apps as the source of the appId and by warning 'It cannot be restored here', which signals this is not a reversible or soft operation. It stops short of naming an alternative (e.g. replace_streamlit_files) when the user only wants to change content.

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

fastero_disable_triggerDisable scheduled triggerA
Idempotent
Inspect

Pause a trigger: a Python schedule stops starting runs, a dashboard’s or page’s automatic refresh stops, a watcher stops watching. A run already under way finishes, and the trigger is kept, not deleted, for fastero_enable_trigger. Owners, admins and editors of the organization can pause any trigger, whoever made it; one already off is refused as already disabled, and nothing changes. Dashboard emails, alerts and notebook runs are schedules, switched off with fastero_set_schedule_enabled.

NameRequiredDescriptionDefault
triggerIdYesA trigger’s id, from fastero_list_triggers.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare write/idempotent/non-destructive at a generic level; the description adds concrete behavior—running jobs finish, the trigger is retained (not deleted) for re-enabling, and an already-off trigger is refused with no change. This is exactly the extra context the bar asks for, and nothing contradicts idempotentHint=true or destructiveHint=false.

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?

Purpose is front-loaded in the first clause, and every subsequent sentence carries distinct information (persistence, permissions, edge case, alternative). It is dense and somewhat run-on, but there is no filler to cut.

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?

No output schema exists, but the description fully covers what an agent needs to call it correctly: side effects, reversibility, authorization, refusal behavior, and the alternative tool for adjacent trigger types.

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

Parameters3/5

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

Single parameter with 100% schema coverage; the schema already documents triggerId and even its source (fastero_list_triggers). The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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+resource (pause a trigger) and immediately enumerates what it affects across the domain: Python schedules, dashboard/page refresh, watchers. It explicitly names the re-enabling sibling fastero_enable_trigger, so an agent can differentiate without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit conditions: use fastero_enable_trigger to reverse, and use fastero_set_schedule_enabled instead for dashboard emails, alerts and notebook runs. Also states permission scope (owners, admins, editors can pause any trigger) and the already-disabled edge case.

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

fastero_enable_triggerEnable scheduled triggerA
Idempotent
Inspect

Switch a trigger back on: a Python schedule runs on its cron again, a dashboard’s or page’s automatic refresh resumes, a watcher watches again. Nothing runs straight away. Owners, admins and editors of the organization can switch on any trigger, whoever made it; one already on is refused as already enabled, and nothing changes. Dashboard emails, alerts and notebook runs are schedules, switched with fastero_set_schedule_enabled.

NameRequiredDescriptionDefault
triggerIdYesA trigger’s id, from fastero_list_triggers.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds that nothing runs immediately, that permission is required, and that an already-enabled trigger is refused as a no-op. The refusal semantics are a meaningful nuance on top of the idempotency hint.

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

Conciseness5/5

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

Front-loads the effect ('switch back on' plus what that means), then constraints and the alternative. Every sentence carries distinct information with no redundancy.

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 single-parameter toggle with no output schema and safety already covered by annotations, the description supplies effects, permissions, no-op behavior, and sibling routing. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Only one parameter (triggerId) and schema description coverage is 100%, so the schema already documents it, including its provenance ('from fastero_list_triggers'). The description adds nothing further about the parameter, so the baseline 3 applies.

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+resource ('Switch a trigger back on') and enumerates what a trigger covers (Python schedule, dashboard/page refresh, watcher), which lets an agent identify the resource class precisely. It also explicitly excludes dashboard emails, alerts and notebook runs, routing those to a named sibling.

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

Usage Guidelines5/5

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

Gives explicit conditions: who may use it (owners, admins, editors of the org, regardless of creator), what happens if the trigger is already on (refused, nothing changes), and names the alternative (fastero_set_schedule_enabled) for non-trigger schedules. No inference required.

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

fastero_ensure_python_entrypointMake Python file runnableA
Idempotent
Inspect

Make a file in a Python project runnable by giving it an entrypoint, and return that entrypoint id. Only a .py file can be an entrypoint. Safe to call again: an existing entrypoint for the same path is returned unchanged, because schedules are stored against its id.

NameRequiredDescriptionDefault
pathYesPath of the .py file to make runnable, e.g. 'main.py' or 'scripts/weekly.py'.
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Goes beyond the idempotentHint annotation by explaining why re-calling is safe and warning that schedules are keyed to the entrypoint id, which is non-obvious and prevents accidental duplication. It does not disclose permission requirements or behavior when the path is absent/invalid.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the primary action and each carrying distinct information (what it does, the file-type constraint, idempotency rationale). No filler.

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

Completeness4/5

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

With no output schema, the description usefully states the return value (an entrypoint id) and the idempotency contract. For a simple 3-param tool with annotations covering safety, this is nearly complete; only error/permission behavior is unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so projectId and pythonProjectId are already documented. The '.py only' constraint overlaps the schema's own 'Path of the .py file' wording, adding little beyond what the schema already states; baseline 3 applies.

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+resource: turns a Python file into an entrypoint and returns the entrypoint id. The operation is distinct from every sibling (no other tool touches entrypoints), and the '.py only' scope is stated up front.

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

Usage Guidelines4/5

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

Gives clear context ('make a file runnable') plus a real precondition/exclusion ('Only a .py file can be an entrypoint') and re-call guidance ('Safe to call again'). It does not name alternative tools (e.g. write_python_file) for adjacent tasks, so it stops short of a 5.

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

fastero_get_connectionGet connectionA
Read-only
Inspect

Read one data connection's settings: its name, datasource, its credentials other than secrets (host, port, database, username, sslMode and the like), whether a password or key is stored (secrets), and its last connection test (connectionTest: lastOkAt, lastErrorAt, lastMessage); a connection through an SSH bastion also has sshAuthorizedKeysLine, the line for the bastion's authorized_keys. Passwords, private and secret keys, and tokens never come back. Use it to see where a connection points or why it fails; fastero_list_connections gives the connectionId and lists every connection without these details, and fastero_list_connection_schemas lists its tables. An id with no connection in this organisation answers "Connection not found". Any member of the organisation can read it.

NameRequiredDescriptionDefault
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare a safe read; the description goes well beyond by disclosing the returned field set (name, datasource, non-secret credentials, connectionTest timestamps and message, sshAuthorizedKeysLine), the redaction guarantee ('Passwords, private and secret keys, and tokens never come back'), and the authorization scope ('Any member of the organisation can read it'). That is exactly the context 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?

One dense paragraph, front-loaded with the purpose, then fields, then alternatives. The mid-sentence field enumeration is heavy but every element (secret redaction, SSH bastion case, failure message, auth scope) earns its place; a light restructuring into sentences would read better.

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?

There is no output schema, so the description must describe the return shape, and it does so field by field, including the conditional SSH field and the test-status subfields. With permissions, redaction and not-found behaviour all covered, nothing an agent needs before calling is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single connectionId parameter is already documented in the schema as coming from fastero_list_connections. The description adds only the behavioural consequence of an unknown id, not new syntax or format semantics, so baseline 3 applies.

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

Purpose5/5

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

Opens with a specific verb and resource ('Read one data connection's settings') and immediately enumerates what those settings are. It explicitly distinguishes itself from fastero_list_connections (id + list, no details) and fastero_list_connection_schemas (tables), so an agent can route between the three without opening any schema.

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?

'Use it to see where a connection points or why it fails' states the selecting condition, and both alternative siblings are named with what they return instead. It even names the substitute result for a bad id ('Connection not found'), removing ambiguity about failure semantics.

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

fastero_get_dashboardGet dashboardA
Read-only
Inspect

Read one dashboard’s layout and settings: name, description, filters (its filter bar), tabs, items (where each chart sits, by reportId), url (the page where a signed-in member opens it) and refresh, its automatic refresh while on, or null when it has none or it is paused. Read it before fastero_update_dashboard, whose layout, filters and tabs each replace the whole list. Items say where a chart sits, not what it shows: fastero_get_report reads one chart and names the saved query behind it, and fastero_list_dashboards lists dashboards without their url or refresh. fastero_disable_trigger pauses the refresh by its triggerId; a paused one is in fastero_list_triggers, named dashboard: or dashboard-change:, for fastero_enable_trigger. Nothing is run. A dashboard not in this project answers "Dashboard not found". Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
dashboardIdYesA dashboard’s id, from fastero_list_dashboards.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint; the description goes further by stating "Nothing is run", disclosing the authorization profile ("Any project member, viewers included, can read it") and the failure mode ("A dashboard not in this project answers 'Dashboard not found'"). It also clarifies the ambiguous null semantics of refresh (none vs. paused) and where a paused trigger is discoverable.

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 highest-value content (what it returns, and the read-before-update rule) is front-loaded with no filler sentences. The closing trigger paragraph is convoluted — it packs disable/enable/list_triggers and the dashboard:<id> naming convention into one dense run of clauses that takes a second pass to parse.

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?

There is no output schema, so the description carries the entire burden of explaining return values, and it does so field by field, including the distinction between item placement (reportId) and chart content. Permissions, error behavior, and mutation-adjacency are all covered for a two-parameter read tool.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already state their provenance (projectId from fastero_list_projects, dashboardId from fastero_list_dashboards), so the schema does the heavy lifting. The description adds no format, casing, or ID-shape detail beyond that, leaving this at the baseline.

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

Purpose5/5

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

Opens with a specific verb+resource ("Read one dashboard's layout and settings") and then enumerates exactly what is returned: name, description, filters, tabs, items, url, refresh. It also draws the line against the two nearest siblings (fastero_list_dashboards omits url and refresh; fastero_get_report covers what a chart shows), so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit ordering rule ("Read it before fastero_update_dashboard, whose layout, filters and tabs each replace the whole list") and names the alternatives for adjacent needs: fastero_get_report for chart content, fastero_list_dashboards for a cheap list, fastero_disable_trigger/enable_trigger plus fastero_list_triggers for paused refresh. Each alternative is paired with the condition that selects it.

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

fastero_get_definitionsGet definitionsA
Read-only
Inspect

The organisation's shared definitions, for writing SQL about a business question: metrics (what revenue, MRR or churn mean, as SQL expressions), datasets (which table holds what, its fields and time fields), relationships (how tables join, by which columns) and notes your admins wrote about querying the data (naming conventions, fiscal calendar). Pass connectionId for the definitions that apply to that database (the organisation-wide ones plus its own, and its own replaces an organisation-wide one of the same kind and name); search filters by name, synonym or description. A metric's expression is the organisation's agreed wording for that number, so a query built from it agrees with the team's own reports.

NameRequiredDescriptionDefault
searchNoWords to look for, e.g. "revenue".
connectionIdNoThe connection the SQL will run on: a data connection’s id, from fastero_list_connections.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: connectionId returns organisation-wide definitions plus the connection's own, with the connection's own replacing an org-wide one of the same kind and name — a precedence rule an agent could not infer elsewhere.

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?

It is one dense paragraph, but it is front-loaded with the resource and its subtypes before moving to the parameters. Every clause carries information (the four subtypes, the override rule, the search fields, the rationale for metric expressions); only the closing sentence about agreeing with team reports is slightly redundant with the earlier metric explanation.

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?

Both optional parameters are documented in the schema and enriched in prose, there is no output schema to explain, and the description covers what kinds of definitions come back and how connection scoping works. An agent has everything needed to call it correctly and interpret the result.

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 baseline would be 3. The description goes beyond the schema by spelling out the inheritance/override behaviour of connectionId and by stating that search matches on name, synonym or description — the synonym matching in particular is not in the schema's "Words to look for" wording.

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 description opens with a specific verb+resource ("The organisation's shared definitions") and immediately enumerates the four subtypes returned: metrics, datasets, relationships and admin notes. It is clearly distinguishable from siblings like fastero_run_sql (executes) or fastero_save_definition (writes) because it frames itself as the read side of the definition store.

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

Usage Guidelines4/5

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

It states the triggering context explicitly — "for writing SQL about a business question" — and explains that a query built from a metric agrees with the team's reports, which tells the agent when this lookup is worth doing. It never names an alternative (e.g. fastero_list_connection_schemas for raw table structure) or says when not to use it, so it stops short of full routing guidance.

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

fastero_get_notebook_runGet notebook runA
Read-only
Inspect

Check how a notebook run that fastero_run_notebook started is going. Returns runId, status (running, success or failed), startedAt, completedAt, durationMs and error: the first cell that failed, as "Cell 3: KeyError: 'region'", or why the run stopped. It only reads the run: status stays running until the run ends, and nothing is retried. To run the notebook again, fastero_run_notebook; while a run is in progress it returns that run instead, unless the run has said running for over an hour. The cells' outputs are read with fastero_read_notebook once the run has finished. A runId from another notebook or project answers "Notebook run not found." Any project member, viewers included, can check a run.

NameRequiredDescriptionDefault
runIdYesA notebook run’s id, from fastero_run_notebook.
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, non-destructive), and the description adds substantial context beyond them: status only flips when the run ends, nothing is retried, an error field reports the first failing cell with an example format, a foreign runId returns "Notebook run not found.", and permission scope is spelled out.

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 purpose, then the return fields, then behavioral caveats and alternatives — a sensible ordering with little waste. The sentence about fastero_run_notebook returning an in-progress run 'unless the run has said running for over an hour' is dense and slightly harder to parse than the rest.

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?

There is no output schema, so the description carries the return contract itself — it enumerates runId, status values, timestamps, durationMs and the error shape. Combined with the not-found behavior and permission note, an agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

Schema description coverage is 100% and each parameter already names its source tool (fastero_run_notebook, fastero_list_projects, fastero_list_notebooks), so the schema does the heavy lifting. The description adds only the cross-notebook/project failure behavior, which is a modest increment over structured data.

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

Purpose5/5

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

Opens with a specific verb+resource: checks the progress of a notebook run that fastero_run_notebook started. It explicitly distinguishes itself from fastero_run_notebook (which starts runs) and fastero_read_notebook (which reads cell outputs), so an agent can route between the three without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (poll a started run), alternatives (fastero_run_notebook to re-run, fastero_read_notebook for outputs once finished), and an edge case (a run 'said running' for over an hour). It also states the access precondition — any project member including viewers can check a run.

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

fastero_get_pageGet pageA
Read-only
Inspect

Read one hosted page in full, to change or fix it: its HTML, its widgets (each name and widgetId), url, noteEnabled, refresh (its automatic refresh, or null when off) and recentErrors, the last 5 errors its code threw in viewers' browsers, each with when. fastero_update_page replaces the HTML; fastero_list_pages lists pages without it, and fastero_show_page shows one live without bringing its HTML into the conversation. Nothing is run and no widget rows are read. A page deleted or not in this project answers "Page not found". Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
pageIdYesA hosted page’s id, from fastero_list_pages.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well past the readOnlyHint/destructiveHint annotations by disclosing side-effect absence ('Nothing is run and no widget rows are read'), the exact failure mode ('A page deleted or not in this project answers "Page not found"'), and the permission model ('Any project member, viewers included, can read it'). Those are the auth and error-behavior details an agent cannot infer from 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?

Purpose and payload are front-loaded in the first clause, and the alternative-tool routing follows immediately. It is one dense run-on paragraph packing many clauses (widget fields, error counts, permissions, error string), which is efficient but could be broken up for scannability.

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?

With no output schema, the description carries the return-shape burden and does so fully — field names, nested widget structure, and the recentErrors payload with timestamps. Permission scope and the not-found response complete what an agent needs before calling.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their provenance (from fastero_list_pages and fastero_list_projects). The description adds only indirect meaning, via the 'not in this project' error case for projectId, so the baseline 3 for schema-covered parameters is right.

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 ('Read one hosted page in full') and immediately enumerates what comes back: HTML, widgets with name and widgetId, url, noteEnabled, refresh, and recentErrors with timestamps. It also explicitly distinguishes itself from fastero_update_page, fastero_list_pages, and fastero_show_page, so an agent can route correctly without opening any schema.

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?

Names three alternatives with the exact condition that selects each: update_page replaces the HTML, list_pages lists without it, show_page shows one live without pulling HTML into the conversation. That is an explicit when-to-use / when-not-to-use map rather than implied guidance.

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

fastero_get_page_dataRead page dataA
Read-only
Inspect

Return the current rows of one widget a hosted page declares, as { rows, lastUpdated, truncated }. The live page card that fastero_show_page draws calls it for each widget, and it is marked app-only so the numbers stay out of the conversation; to read a page's HTML and widget names, fastero_get_page, and to show a page, fastero_show_page. Rows come from a recent cached result, else a fresh run of the widget's saved query, else the last stored copy, a spreadsheet widget's from its spreadsheet, and a notebook-cell widget's from its notebook's last run (a cell that cannot give rows, such as one showing no table, is refused with what to change); lastUpdated says when they were taken, and a long result is cut, with truncated true. name is the widget's name as the page declares it: a name the page did not declare is refused, as is one whose widget was deleted, and a page deleted or not in this project answers "Page not found". Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
nameYesThe widget's name as the page declares it (widgets in fastero_get_page).
pageIdYesA hosted page’s id, from fastero_list_pages.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well past readOnlyHint/destructiveHint: it discloses the data-provenance cascade (recent cache, then a fresh run of the saved query, then last stored copy, with spreadsheet and notebook-cell special cases), truncation with truncated=true, refusal behavior for undeclared or deleted widgets, 'Page not found' for deleted or cross-project pages, and that any project member including viewers can read it.

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

Conciseness3/5

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

Front-loaded with the return shape, which is good, but the rest is one dense run-on paragraph blending provenance, errors, permissions and truncation into semicolon-chained clauses. Every fact earns its place, yet the structure makes it harder to scan than it needs to be.

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?

With no output schema and no annotations beyond read-only hints, the description still covers return fields, freshness semantics, truncation, error responses and authorization. An agent has everything needed to call it and interpret the result.

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; the description adds real meaning for `name` by requiring it to be a name the page actually declares (cross-referencing fastero_get_page) and by describing the refusal that follows an undeclared or deleted widget name. projectId and pageId are left entirely to 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 (return the current rows of one widget declared by a hosted page) and immediately gives the return shape { rows, lastUpdated, truncated }. It explicitly distinguishes itself from fastero_get_page (HTML and widget names) and fastero_show_page (display).

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

Usage Guidelines4/5

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

Names the two closest siblings and what each is for, so the agent can route correctly, and discloses that the tool is marked app-only so the data stays out of the conversation. It stops short of stating an explicit 'use this instead of X when Y' rule, but the alternatives are clear.

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

fastero_get_python_projectGet Python projectA
Read-only
Inspect

Read one Python project in full: its name, description, source (local, or the repository, branch and folder it is linked to), Python environment, entrypoints (the files it can run, each with the id fastero_run_python_project and fastero_set_python_schedule take) and localFiles, every file stored in it with its size. Use it to find an entrypoint id or see what is stored; fastero_list_python_projects finds the pythonProjectId, fastero_list_python_files lists files folder by folder, a linked repository's included, and fastero_list_python_runs lists its runs. Its schedule is a trigger, py:: in fastero_list_triggers. A deleted project still answers here, with isDeleted true; an id with no Python project in this project answers "Project not found". Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already state readOnlyHint=true/destructiveHint=false, yet the description adds real behavioral context beyond them: a deleted project still returns with isDeleted true, an unknown id returns 'Project not found' rather than erroring, and any project member including viewers can read. Those edge-case and permission facts are exactly what an agent needs and cannot get from the 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?

Front-loaded with the payload contents and then the sibling routing, which is the right order. It is a single dense paragraph with many sibling references; every clause carries information, but the density makes it slightly harder to scan than an ideal definition.

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?

There is no output schema, yet the description enumerates the returned fields, the deleted-project marker, the not-found response, and the permission scope. Combined with the two fully documented parameters, an agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their provenance (projectId from fastero_list_projects, pythonProjectId from fastero_list_python_projects). The description adds only indirect meaning, noting that entrypoint ids are the values consumed by fastero_run_python_project and fastero_set_python_schedule, but nothing about the two parameters themselves beyond the schema. Baseline 3 is appropriate.

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 ('Read one Python project in full') and then enumerates exactly what is returned: name, description, source, environment, entrypoints, localFiles. It explicitly distinguishes itself from fastero_list_python_projects, fastero_list_python_files and fastero_list_python_runs, so an agent can pick it without opening the schema.

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

Usage Guidelines5/5

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

Gives a concrete when-to-use ('to find an entrypoint id or see what is stored') and names the alternative for each neighbor: list_python_projects for the id, list_python_files for folder-by-folder listing, list_python_runs for run history. This is explicit routing, not implied usage.

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

fastero_get_python_run_logGet Python run logA
Read-only
Inspect

Read what one finished Python run printed: returns stdout, stderr and truncated. Each stream keeps its end, where a failed run's traceback is: the run saves the last 60,000 characters of each, and this returns the last 50,000 of those. When the start of either was cut, truncated is true and a note says so, with how long each saved stream was. The runId comes from fastero_list_python_runs, which also gives a run's status and error without the log. Only a run that has finished, succeeded or failed, has a log: a run still queued or running answers "This run has no saved output", as does a runId from another Python project. The files a run saved are read with fastero_read_python_file. Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
runIdYesA Python run’s id, from fastero_list_python_runs.
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true/destructiveHint=false; the description adds substantial context beyond that: the run stores the last 60,000 chars of each stream and this returns the last 50,000, so t​​he tail (where tracebacks live) is kept, truncated=true plus a note when the head was cut, and the permission model (any project member, viewers included).

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 return contract, then truncation semantics, then id sourcing and exclusions, then permissions — a logical order with little waste. Slightly long at five sentences, and the 60,000/50,000 detail, while useful, is the densest part.

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?

No output schema exists, so the description must describe the return value and it does: stdout, stderr, truncated flag, and an explanatory note. Combined with the empty-result case and permission model, an agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already names its source tool, so the schema carries the load and baseline 3 applies. The description's only additional semantics is that a runId from another Python project yields no output, which is a modest increment.

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 (read a finished Python run's printed output) and enumerates exactly what comes back: stdout, stderr and truncated. It is clearly separable from fastero_list_python_runs (status/error without the log) and fastero_read_python_file (files the run saved).

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 the agent: get runId from fastero_list_python_runs, use that tool instead if only status/error is needed, use fastero_read_python_file for saved files. It also names the when-not case — a queued/running run or a runId from another Python project returns 'This run has no saved output'.

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

fastero_get_queryGet saved queryA
Read-only
Inspect

Read one saved query: its name, SQL text (string), the connection it runs on (conn) and definitionsUsed, the shared definitions it was built from. Nothing is run: fastero_run_sql runs SQL and returns rows. A report built on it names it as its query in fastero_get_report.

NameRequiredDescriptionDefault
queryIdYesA saved query’s id, from fastero_list_queries.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds real value on top by naming the concrete fields returned (name, SQL text, conn, definitionsUsed) and confirming that executing the query is explicitly out of scope. No cost, latency, or auth detail, but the key behavioral claim is unambiguous.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and return payload, then the run_sql disambiguation and the report relationship. No sentence is filler.

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

Completeness4/5

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

With no output schema, the description correctly compensates by listing the returned fields, and it notes the report linkage via fastero_get_report. It does not describe errors for a missing/foreign queryId, which would be the last piece of context an agent might want.

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

Parameters3/5

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

Schema description coverage is 100%, and both parameters already document where their ids come from (fastero_list_queries, fastero_list_projects). The description adds no further parameter semantics, so the baseline 3 applies.

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 ("Read one saved query") and enumerates the payload it returns: name, SQL text, connection (conn), and definitionsUsed. It explicitly separates itself from fastero_run_sql, which is the sibling an agent would most plausibly confuse it with.

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

Usage Guidelines4/5

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

"Nothing is run: fastero_run_sql runs SQL and returns rows" gives an explicit when-not plus the alternative to pick instead. It also implies the queryId comes from fastero_list_queries. It stops short of stating the list-vs-get selection rule outright, so it is strong but not exhaustive.

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

fastero_get_reportGet reportA
Read-only
Inspect

Read one report: a chart, table, number, map or text block that dashboards place. It comes with its name, type, widgetType and chartType, the assignments naming the columns it plots, its display settings, query (the id of the saved query it reads, whose SQL fastero_get_query returns) and url, the chart’s own page. A Vega-Lite chart has chartType VegaLite and its description in chartProps.vegaLite, with chartRevision and chartHistoryNotes, the last five changes. Nothing is run; a widget built from a spreadsheet carries its rows. fastero_get_dashboard says which reports a dashboard places. fastero_show_report shows the chart itself.

NameRequiredDescriptionDefault
reportIdYesA report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only cover the read-only safety profile, and the description adds genuinely new behavioral facts: "Nothing is run" (reading a report does not execute its query), the payload contents (name, type, widgetType, chartType, assignments, display settings, query id, url), Vega-Lite special-casing via chartProps.vegaLite with chartRevision and last-five chartHistoryNotes, and that spreadsheet-backed widgets carry their rows.

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?

Purpose is front-loaded in the first clause and nearly every clause carries a distinct fact. It is a dense single paragraph with heavily nested parentheticals ("its query (the id of the saved query it reads, whose SQL fastero_get_query returns) and url"), which costs some readability.

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?

There is no output schema, so the description bears the full burden of describing the return payload, and it does so thoroughly, including the Vega-Lite variant and revision history. Combined with the sibling routing, an agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already document their provenance (fastero_list_reports / dashboard items; fastero_list_projects). The description body adds no further parameter-level detail, so the baseline 3 applies — the schema carries this dimension.

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?

Specific verb plus resource ("Read one report"), and it immediately defines what a report is — "a chart, table, number, map or text block that dashboards place" — so the agent knows the object model. It distinguishes itself from the near-name siblings (fastero_get_dashboard, fastero_show_report, fastero_list_reports) by naming them and their distinct roles.

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

Usage Guidelines4/5

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

Three routing alternatives are given: fastero_get_dashboard identifies which reports a dashboard places, fastero_show_report renders the chart itself, and fastero_get_query returns the SQL behind the referenced query. The selection conditions are implied by those roles rather than phrased as explicit "use X when Y", so it falls just short of a 5.

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

fastero_get_streamlit_appGet Streamlit appA
Read-only
Inspect

Read one Streamlit app with its files: appId, name, status (stopped, starting, running or stopping), alwaysOn, errorMessage (why its last start failed, if it did), lastStarted, source ("files", or the Git provider, branch and sync state of an app imported from Git), viewerUrl, and each file’s path, name and content. Use it to read an app’s code before changing it, or to see whether a start has finished: a running, starting or stopping status is checked against the app’s server first. fastero_list_streamlit_apps lists apps without their files, and fastero_get_streamlit_app_logs has the start-up output, pip’s errors included. Files are cut past 50,000 characters each and 300,000 in all, marked with truncatedFrom. viewerUrl is the page a signed-in project member opens; apps have no public link — share one by inviting people to the project (fastero_invite_to_project). An app deleted or not in this project answers "Streamlit app not found." Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare it a safe read; the description adds substantial context beyond that: live status is verified against the app's server, files are truncated past 50,000 chars each / 300,000 total and flagged with truncatedFrom, viewerUrl is member-only, a missing/deleted app returns "Streamlit app not found.", and any project member including viewers may call it.

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 verb and resource, and every sentence carries information — field inventory, use cases, alternatives, truncation limits, sharing, not-found behavior, permissions. It is a single dense block rather than clearly segmented, which costs a point but nothing is redundant.

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?

There is no output schema, so the field enumeration is load-bearing and thorough. Combined with truncation limits, permission scope, error behavior and sibling routing, an agent has everything needed to call this and interpret the result correctly.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their provenance (appId from list_streamlit_apps, projectId from list_projects), so the baseline is 3. The description names appId in the field list but adds no format, syntax or constraint detail beyond what the schema provides.

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?

"Read one Streamlit app with its files" gives a specific verb, resource and scope, then enumerates the exact returned fields (status, alwaysOn, errorMessage, source, viewerUrl, per-file path/name/content). It explicitly separates itself from fastero_list_streamlit_apps (no files) and fastero_get_streamlit_app_logs (start-up output), so an agent can pick correctly without opening schemas.

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?

Two concrete use cases are stated: reading an app's code before changing it, and checking whether a start has finished. The alternatives are named with the condition that selects each — list_streamlit_apps for metadata only, get_streamlit_app_logs for startup/pip errors — and sharing is redirected to fastero_invite_to_project since there is no public link.

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

fastero_get_streamlit_app_logsGet Streamlit app logsA
Read-only
Inspect

Read the start-up log of a Streamlit app's most recent start: the file sync, pip install (including pip's own error) and Streamlit's first lines. It covers the first five minutes after a start only, is cleared at each start, and secret values in it are redacted.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only establish readOnlyHint/destructiveHint; the description adds real behavioral detail beyond them — retention window (first five minutes), that the log is cleared at every start, and that secret values are redacted. It does not disclose the failure mode when no recent start exists or a log has already been aged out.

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

Conciseness5/5

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

A single dense sentence that front-loads what is read and follows with the scoping and safety constraints; every clause (contents, time window, clearing, redaction) carries information an agent needs.

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

Completeness4/5

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

With no output schema, the description usefully characterizes what the returned text will contain and how it is bounded. It is nearly complete, missing only what the agent sees when there is no recent start or the log has been emptied.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters already document their source (fastero_list_streamlit_apps, fastero_list_projects). The description adds no parameter-level meaning beyond the schema, so the baseline 3 applies.

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 (Read) and resource (the start-up log of a Streamlit app's most recent start), and enumerates the log's contents (file sync, pip install including pip errors, Streamlit's first lines). This scopes it away from the adjacent siblings get_streamlit_app (metadata) and get_python_run_log (a different runtime).

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

Usage Guidelines4/5

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

Clearly frames the applicable context: it covers the first five minutes after a start and the log is cleared at each start, which effectively tells the agent when this tool is useful versus futile. It stops short of naming an alternative for older starts or a different diagnostic tool, so no explicit when-not/alternative routing.

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

fastero_invite_to_projectInvite to projectA
Destructive
Inspect

Ask to invite someone by email to view a project. No email is sent by this call: the invite waits until a signed-in Owner or Admin of the organisation confirms it at confirmUrl, a page in Fastero that names the address, the project and the organisation and says they will be able to view every project in the organisation. Confirming sends the invitation, whose link then works for 7 days; unconfirmed, the request lapses after 7 days. Accepting makes them a Viewer of the whole organisation, able to open every project in it, not only this one. Someone already in the organisation is added to the project at once instead, keeps their role, and is sent nothing. Use it for people who should sign in to Fastero; for a link anyone can open without an account, use fastero_share_dashboard. Needs an Owner or Admin role in the organisation. An address with an invite already open in this project is refused (409), and so is a request once 20 asked for in the same person's name await confirmation (429); requests do not count against the 20 invitation emails a person may send a day, but confirming one does. Returns inviteId and status: 'awaiting_confirmation' with confirmUrl and expiresAt, or 'added' for someone already in the organisation.

NameRequiredDescriptionDefault
appIdNoThe Streamlit app they land on when they accept: an app’s id, from fastero_list_streamlit_apps.
emailYesThe address the invitation goes to, exactly as the person uses it. The confirmation page shows it to whoever confirms, before anything is sent.
projectIdYesThe project to invite them to: its id, from fastero_list_projects.
dashboardIdNoThe dashboard they land on when they accept: a dashboard’s id, from fastero_list_dashboards.

TDQS

A4.8/5.0
Behavior5/5

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

Far beyond what the annotations provide: it discloses the two-phase confirmation flow, that no email is sent by the call, the 7-day expiry for both confirmation and link validity, escalation to organisation-wide Viewer access, the immediate-add path for existing members, and the 409/429 failure conditions with their rate-limit accounting. These are exactly the mutation consequences destructiveHint=true and openWorldHint=true imply but do not explain.

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 purpose is front-loaded and every clause carries operational weight, but the middle section packs many facts (access scope, membership shortcut, rate limits, return shape) into one dense run-on, which reduces scannability slightly.

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?

No output schema exists, yet the description documents the return payload (inviteId, status, confirmUrl, expiresAt, 'added'). For a mutation tool with 4 parameters, annotations, and no output schema, it supplies everything an agent needs to call and interpret it.

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 meaning beyond it: what the email parameter triggers at confirmation (shown to the confirmer before anything sent) and the observable outcome (inviteId plus 'awaiting_confirmation'/'added' status). The appId and dashboardId landing targets are left to the schema, which is acceptable.

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 first sentence states a specific verb and resource ("Ask to invite someone by email to view a project") and the description names the sibling it is not (fastero_share_dashboard), so an agent can distinguish it from the share-link tool immediately.

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?

It explicitly names when to use it ("people who should sign in to Fastero") and the alternative with its condition ("for a link anyone can open without an account, use fastero_share_dashboard"), plus the role prerequisite (Owner or Admin). Nothing is left to inference.

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

fastero_list_callback_destinationsList callback destinationsA
Read-only
Inspect

List where this organisation's job callbacks can go: each destination's name, kind (webhook, or claude_routine — a Claude Code routine that starts a new Claude session), host, and status (active, or disabled with the reason). An admin adds destinations in Settings → Developers → Callbacks; no tool can add one. fastero_set_job_callback takes a name from here.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful context beyond them: destination creation is admin-only and impossible via any tool, and destinations can be 'disabled with the reason', signalling that a non-active status carries diagnostic text.

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

Conciseness5/5

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

Three sentences, zero filler, front-loaded with what is listed before the operational constraints. The parenthetical explanation of 'claude_routine' and the pointer to set_job_callback both earn their space.

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?

With no output schema and no parameters, the description is the only source of return-shape information, and it supplies it fully, including the semantics of each status value and how the result feeds the next tool. Nothing needed to call this correctly is missing.

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

Parameters4/5

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

Zero parameters, so the schema carries nothing to misread and the baseline is 4. The description instead documents the shape of the result (name, kind, host, status), which is the more useful information here.

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 ('List where this organisation's job callbacks can go') and enumerates the returned fields — name, kind, host, status — with an inline gloss of the non-obvious enum value 'claude_routine'. It also names the downstream sibling fastero_set_job_callback, so an agent can distinguish it from the many other list_* tools without opening any schema.

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

Usage Guidelines4/5

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

It gives a clear use route ('fastero_set_job_callback takes a name from here') and rules out a tempting but impossible action ('An admin adds destinations in Settings → Developers → Callbacks; no tool can add one'), which prevents an agent from hunting for a create tool. It stops short of an explicit when-not against any listed sibling, since no alternative list tool exists.

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

fastero_list_connectionsList connectionsA
Read-only
Inspect

List every data connection in this organisation, from all its projects, to pick the connectionId that fastero_run_sql, fastero_list_connection_schemas, fastero_create_query and fastero_show_chart take. Each comes with its _id, name, datasource (pg for Postgres, mysql2, mssql, snowflake, bq for BigQuery, duckdb for an uploaded file, and others), database (the database's name; for BigQuery, the project id), who created it and when. No credentials, hosts or test results: fastero_get_connection reads one connection's settings and last test, and fastero_list_connection_schemas its tables. Any member of the organisation can list them. orgId can be left out: it can only be the organisation this key belongs to.

NameRequiredDescriptionDefault
orgIdNoThe organization’s id; it defaults to the organization this key belongs to, the only one it reaches.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description's job is to add context, which it does: it states the scope (all projects in the organisation), the exact fields returned and the fields deliberately withheld, and the permission floor ('Any member of the organisation can list them'). That is unusually complete disclosure for a read-only listing tool.

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 purpose and the connectionId payoff, and the exclusion of credentials is stated before the alternatives. The datasource parenthetical and the orgId closing sentence duplicate information already in the schema, which is the only waste in an otherwise tight description.

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?

There is no output schema, so the description carries the return-value burden itself, and it does: _id, name, datasource, database (including the BigQuery project-id caveat), creator and timestamp. Combined with the read-only annotations and the org-scoping note, an agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema coverage is 100% and the single orgId parameter is already documented as defaulting to the key's organisation. The description's closing sentence ('orgId can be left out: it can only be the organisation this key belongs to') restates that rather than adding new semantics, so the baseline 3 applies.

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?

Starts with a specific verb and resource ('List every data connection in this organisation, from all its projects') and immediately ties the output to the connectionId consumed by fastero_run_sql, fastero_list_connection_schemas, fastero_create_query and fastero_show_chart. An agent can tell exactly what it gets and why it matters without opening any schema.

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 the agent: use this to pick a connectionId, use fastero_get_connection for settings and last test, and fastero_list_connection_schemas for tables. The exclusion of credentials/hosts/test results makes the boundary with fastero_get_connection unambiguous.

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

fastero_list_connection_schemasList connection schemasA
Read-only
Inspect

List the schemas, tables and columns that a connection's database login can see: the names SQL on it is written against. Returns a list of schemas, each with its tables, and each table with its type and its column names; an uploaded file's connection holds one table. Use it to find table and column names before fastero_run_sql or fastero_create_query. fastero_get_definitions holds what this organisation's metrics and tables mean, and fastero_get_connection the connection's own settings. It reads the database live on every call and answers in one piece, without paging, so a large database gives a long answer. Owners, admins and editors of the organisation can use it; a viewer is refused ("Insufficient rights"), and an id with no connection in this organisation answers "Connection not found".

NameRequiredDescriptionDefault
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description goes further with live-read-on-every-call, no paging, long answers on large databases, and even the exact refusal messages ('Insufficient rights', 'Connection not found'). That permission and error disclosure is genuinely useful, but return-shape and paging already carry the main behavioral weight for a read tool, so it sits at a solid mid-high rather than exceptional.

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 verb and scope, then alternatives, then behavior, then permissions — a logical order with no filler. It runs long for a single-parameter read tool, but nearly every clause carries distinct information, so the density is justified.

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?

No output schema exists, yet the description spells out the return structure (schemas → tables → type and column names), plus the permission model, the exact error strings, and the no-paging characteristic. An agent can call this correctly and interpret the response without further exploration.

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

Parameters3/5

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

Schema coverage is 100% and the schema already explains that connectionId comes from fastero_list_connections or fastero_create_file_connection. The description adds only the adjacent fact that an uploaded file's connection holds one table, which is contextual rather than parameter-level; the schema does the heavy lifting, so baseline 3 applies.

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 — 'List the schemas, tables and columns that a connection's database login can see' — and pins the scope to what the login can see, which is the exact axis an agent needs. It is unmistakably distinct from sibling list tools like fastero_list_connections or fastero_get_connection.

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 usage: 'Use it to find table and column names before fastero_run_sql or fastero_create_query,' and then rules out the two nearest neighbours by stating what fastero_get_definitions and fastero_get_connection hold instead. When-to-use and when-not-to-use are both covered without inference.

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

fastero_list_dashboardsList dashboardsA
Read-only
Inspect

List a project's dashboards, oldest first. Each comes with its _id (the dashboardId the other dashboard tools take), name, description, who made it, its filters and tabs, and items: where each chart sits, by reportId. Dashboards are shared with everyone in the organization. fastero_get_dashboard reads one with its link and automatic refresh; fastero_list_reports says what the charts are.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds access context ('Dashboards are shared with everyone in the organization') and enumerates the returned fields, which is meaningful information beyond the structured fields.

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

Conciseness4/5

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

Front-loads purpose and ordering, then return contents, then sharing, then related tools. Efficient overall, though the itemized return-field list is slightly dense; each sentence still earns its place.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so by enumerating the returned fields (_id, name, description, author, filters, tabs, items with reportId). It omits any pagination or result-size guidance, which is the only notable gap.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents projectId (from fastero_list_projects). The description adds no syntax or format detail beyond that, so the baseline of 3 applies.

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 ('List a project's dashboards') plus an ordering guarantee ('oldest first'). It also names the sibling tools it is not (fastero_get_dashboard, fastero_list_reports), so an agent can distinguish it without opening other schemas.

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

Usage Guidelines4/5

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

Points to fastero_get_dashboard for reading one dashboard with its link and refresh, and to fastero_list_reports for the chart definitions, making the routing conditions clear. It stops short of explicitly stating when NOT to use it or listing prerequisites, but the alternative-routing is well covered.

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

fastero_list_filesList project filesA
Read-only
Inspect

List the files in a project: spreadsheets, CSVs, PDFs and other documents people uploaded, and files Fastero's assistant produced (workbooks, documents, PDFs, slides). Each comes with the fileId that fastero_read_file, fastero_rename_file and fastero_delete_file take, its name, its folder path (null at the top level), its type, its size in bytes, when it was last updated, and pathInNotebook: the path a notebook in this project opens it by, e.g. pd.read_csv(pathInNotebook) or pd.read_excel(pathInNotebook). A Python project's code is listed by fastero_list_python_files; notebooks, saved queries and dashboards have list tools of their own.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.1/5.0
Behavior4/5

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

With annotations only declaring readOnlyHint/destructiveHint, the description carries the burden of return-value disclosure, and it does so richly: fileId, name, folder path (with the null-at-top-level semantics), type, size in bytes, last-updated, and pathInNotebook with concrete usage examples (pd.read_csv/pd.read_excel). It omits whether subfolders are traversed recursively, ordering, and any size/result limits, which are real behavioral gaps for a listing tool.

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?

A single dense paragraph that is front-loaded with what gets listed, then what comes back, then the sibling exclusions. Nearly every clause earns its place (pathInNotebook examples, folder-path null semantics), though the return-field enumeration is delivered as one long running clause that could be tightened.

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

Completeness4/5

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

For a read-only, single-parameter list tool with no output schema, the description is nearly sufficient: it names the resource scope, the return payload, and the alternatives. The remaining gap is behavioral detail on enumeration scope (recursive vs top-level only) and result limits, which an agent would otherwise have to discover by trial.

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

Parameters3/5

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

Only one parameter, and the schema already documents it at 100% coverage, including its provenance ('from fastero_list_projects'). The description adds nothing beyond 'in a project' for that parameter. Baseline 3 applies since the schema does the heavy lifting.

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 ('List the files in a project') and immediately enumerates the resource types covered: uploaded spreadsheets, CSVs, PDFs, documents, plus assistant-produced workbooks, documents, PDFs and slides. It explicitly contrasts with sibling tools ('A Python project's code is listed by fastero_list_python_files; notebooks, saved queries and dashboards have list tools of their own'), so an agent can distinguish it from fastero_list_python_files, fastero_list_notebooks, fastero_list_queries and fastero_list_dashboards without opening any schema.

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

Usage Guidelines4/5

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

Explicitly routes away from this tool for Python code, notebooks, saved queries and dashboards, pointing to the correct alternatives. It also implies the reason to call it (to obtain the fileId consumed by fastero_read_file, fastero_rename_file, fastero_delete_file). It stops short of stating the positive trigger ('call this to find or open a file in a project') as a standalone instruction, but the context is clear.

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

fastero_list_notebooksList notebooksA
Read-only
Inspect

List a project's notebooks, most recently changed first, each with its _id (the notebookId other notebook tools take), title, description and who made it; fastero_read_notebook reads one's cells. Personal notebooks are not listed. Python projects and Streamlit apps have list tools of their own.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful behavioral context: the most-recently-changed ordering and the exclusion of personal notebooks; it does not mention pagination or limits, but that is a minor gap for a read-only list tool.

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

Conciseness5/5

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

The description is a single dense sentence with zero waste, front-loaded with the action, ordering, and returned fields, followed only by the necessary sibling and exclusion notes.

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 one-parameter read-only list tool with full schema coverage and no output schema, the description provides the ordering, returned fields, excluded scope, and sibling alternatives. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description compensates by explicitly stating what _id means and that it is the notebookId other notebook tools accept, which is not in the schema. It does not add semantics beyond the projectId parameter, which is already fully documented.

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 description states a specific verb and resource ('List a project's notebooks'), the ordering ('most recently changed first'), and the returned fields with a cross-reference for _id. It also explicitly distinguishes itself from fastero_read_notebook and notes the exclusion of personal notebooks and separate Python/Streamlit list tools.

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?

It explicitly tells when to use this tool over fastero_read_notebook ('reads one's cells') and explains that personal notebooks are not listed, while pointing to fastero_list_python_projects and fastero_list_streamlit_apps as alternatives. Nothing is left to inference.

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

fastero_list_pagesList pagesA
Read-only
Inspect

List a project's hosted pages, most recently changed first, without their HTML: each with its _id (the pageId other page tools take), name, the widgets it reads by name, and url, the page where a signed-in project member opens it. fastero_get_page reads one's HTML and recent errors; fastero_show_page shows one live in the conversation.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: the sort order, the explicit exclusion of HTML, and the exact fields returned (_id, name, widgets read by name, url). It stops short of mentioning pagination or result limits, which is the only gap for a list endpoint.

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?

Two dense sentences with the core operation front-loaded, and the alternative tools packed into a trailing sentence rather than scattered. The nested appositive for url ('the page where a signed-in project member opens it') is slightly ornate for the value it adds.

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

Completeness4/5

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

There is no output schema, so the description must carry the return shape, and it does enumerate the returned fields and the HTML exclusion. The missing piece is any statement about result volume or pagination, which an agent listing a large project would need.

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

Parameters3/5

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

Schema description coverage is 100% and the single projectId parameter is fully documented in the schema, including its provenance from fastero_list_projects. The description adds nothing parameter-specific, so the baseline 3 applies.

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 (list a project's hosted pages) plus two distinguishing qualifiers: sorted most-recently-changed-first and returned without HTML. It also names the sibling tools it is not (get_page, show_page), so an agent can separate it from the other page tools without opening any schema.

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 the agent: get_page 'reads one's HTML and recent errors' and show_page 'shows one live in the conversation', leaving list as the choice when you only need the inventory. The parenthetical that _id is 'the pageId other page tools take' also tells the agent when to call this first as a discovery step.

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

fastero_list_project_invitesList project invitesA
Read-only
Inspect

List a project's open invites: those emailed and not yet accepted, and those asked for that a person has not confirmed yet. Use it to find the inviteId fastero_cancel_project_invite takes, or to see whether a requested invite has been confirmed and sent. Accepted, cancelled and lapsed invites are not listed. Needs an Owner or Admin role in the project. Returns invites, each with _id, email, createdAt, invitedBy (the user id of whoever asked) and status: 'pending' (emailed), or 'awaiting_confirmation' with confirmUrl, the page in Fastero where a signed-in Owner or Admin of the organisation sends or cancels it.

NameRequiredDescriptionDefault
projectIdYesThe project whose invites to list: its id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say readOnlyHint=true; the description goes further by disclosing the Owner/Admin permission requirement and enumerating the fields returned including the two distinct status values and confirmUrl semantics. That is behavioural context the structured data does not 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 definition and exclusions before the return-value detail, and every clause is informative. Some sentences are heavily nested (the status/confirmUrl clause), which costs a little readability but no sentence is filler.

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?

With no output schema, the description compensates by describing the returned fields and status values, and it covers the auth prerequisite and the exclusion rules. An agent has everything needed to call it and interpret the result.

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

Parameters3/5

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

Schema coverage is 100% and the single projectId parameter is already documented as coming from fastero_list_projects, so the description adds nothing about parameter meaning. Baseline 3 applies when the schema does the work.

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?

Specific verb (List) plus resource (a project's open invites) with an explicit definition of what 'open' means — emailed-and-unaccepted plus requested-and-unconfirmed. It also names the exact boundary against accepted, cancelled and lapsed invites, so the agent can tell this apart from any cancel/mutation sibling.

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

Usage Guidelines5/5

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

Gives two concrete use cases (fetching the inviteId that fastero_cancel_project_invite consumes, and checking whether a requested invite was confirmed and sent) plus an explicit exclusion list. The alternative tool is named with the condition that links the two.

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

fastero_list_projectsList projectsA
Read-only
Inspect

List the projects in this organization, with their ids, and say which organization and account this connection is. Queries, reports and dashboards all live in a project, and the tools for them take its projectId from here.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing what the call returns (project ids plus the current organization and account identity), which is genuine behavioral context for a tool with no output schema.

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?

Two sentences, front-loaded with the core action and return content, followed by the useful hierarchy note. Nothing is wasted, though the second sentence is slightly run-on.

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

Completeness4/5

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

For a zero-parameter list tool with no output schema, the description covers the action, the returned fields and the downstream relationship to projectId-consuming tools. That is sufficient to invoke it correctly; only exhaustive return detail is absent.

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?

The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to document. No misleading parameter information is present.

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 ('List the projects') with scope ('in this organization') and names what is returned (ids). It also differentiates itself from the many list_* siblings by explaining the domain hierarchy — projects contain queries, reports and dashboards — so an agent can place it precisely.

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

Usage Guidelines4/5

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

The second sentence gives clear usage context: it is the source of the projectId that query/report/dashboard tools consume, so an agent knows to call it first. It stops short of explicit exclusions or naming concrete alternatives (e.g. list_python_projects), so it is a 4 rather than a 5.

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

fastero_list_python_filesList Python project filesA
Read-only
Inspect

List one folder of a Python project's code and files, as entries of { name, type (file or dir), path }: the top level by default, or the folder given as path. It does not recurse, so output a run saved, such as outputs/report.md, appears only when outputs is listed. Use it to find the path that fastero_read_python_file, fastero_write_python_file and fastero_ensure_python_entrypoint take. Files uploaded to the project (spreadsheets, PDFs) are listed by fastero_list_files instead, and fastero_get_python_project lists a local project's stored files in one flat list. A project linked to a repository is listed from its branch together with the files written here, without .git, .venv, node_modules or pycache. A folder that does not exist lists nothing, and a path outside the project is refused. Any project member, viewers included, can list it.

NameRequiredDescriptionDefault
pathNoFolder to list, e.g. 'outputs' or 'src/reports'. Omit for the project root.
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/non-destructive annotations: no recursion (so outputs/report.md only appears when outputs is listed), repo-linked projects listed from the branch plus local writes with .git/.venv/node_modules/__pycache__ excluded, nonexistent folder returns empty, out-of-project paths refused, and viewer-level access allowed. These are exactly the edge behaviors an agent needs before calling.

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-loads the verb, resource and return shape, then usage, then alternatives, then edge cases — good ordering with no filler. It is dense with multi-clause sentences (the repo/ignore-list sentence packs four ideas), which slightly taxes readability but every clause carries information.

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?

With no output schema, the description supplies the return entry structure { name, type, path } and covers recursion, filtering, failure modes, and permissions. An agent has everything needed to call this correctly and interpret results.

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% and already documents all three parameters, including 'omit for the project root'. The description reinforces the path default ('the top level by default, or the folder given as path') and adds that the path must be a non-recursive folder scope, which is meaning beyond the schema, though it does not add syntax detail.

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 ('List one folder of a Python project's code and files') plus the exact entry shape returned. It also explicitly separates itself from fastero_list_files and fastero_get_python_project, so an agent can pick it without opening sibling schemas.

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

Usage Guidelines5/5

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

Gives a concrete use case ('Use it to find the path that fastero_read_python_file, fastero_write_python_file and fastero_ensure_python_entrypoint take') and names the two alternative list tools with the condition that selects each. Nothing is left to inference.

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

fastero_list_python_projectsList Python projectsA
Read-only
Inspect

List a project's Python projects (script workspaces), newest first, each with its _id (the pythonProjectId other Python tools take), name, source (local, or a linked repository), Python environment and entrypoints, the files it can run, by id. Deleted ones are not listed. fastero_list_python_files lists one's files.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuine behavioral context beyond that: ordering (newest first), exclusion of deleted items, the returned field set, and the fact that the _id maps to pythonProjectId used by other Python tools.

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 action and heavily information-dense with no filler sentences. The single long sentence is slightly run-on and packs clauses together, but every clause (ordering, exclusion, returned fields, sibling disambiguation) earns its place.

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?

There is no output schema, so the description correctly carries the burden of describing return values (_id, name, source, environment, entrypoints, runnable files by id). Combined with the annotations covering the read-only profile, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and projectId is fully documented in the schema ('The project's id, from fastero_list_projects'), so the baseline of 3 applies. The description adds no additional parameter syntax, format, or edge-case behavior for projectId.

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 ('List a project's Python projects (script workspaces)') and immediately differentiates itself from fastero_list_python_files by scope (projects vs. files). An agent can distinguish it from fastero_get_python_project and fastero_list_projects without opening schemas.

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

Usage Guidelines4/5

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

Names the alternative sibling (fastero_list_python_files) and its distinct scope, plus the project-scoping requirement via projectId. It lacks explicit 'when not to use' guidance versus fastero_get_python_project for single-project lookups, but the context is clear.

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

fastero_list_python_runsList Python runsA
Read-only
Inspect

List a Python project's 50 most recent runs, newest first, with no paging. Each has its _id (the runId fastero_get_python_run_log takes), entrypointId, status (queued, starting, running, succeeded, failed or cancelled; the last three are finished), triggeredBy (a person, a schedule or a workflow), when it was queued, started and finished, the error of a failed one, and savedFiles, the files it wrote into the project.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the read-only, non-destructive profile, and the description goes well beyond them: it discloses the 50-item cap, newest-first ordering, absence of paging, the full status vocabulary with an explicit note that succeeded/failed/cancelled are terminal, the triggeredBy categories, and the savedFiles artifact. That is substantive behavioral context an agent cannot get from the annotations.

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

Conciseness5/5

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

A single sentence that front-loads the key constraint (50 most recent, newest first, no paging) before the field enumeration. The trailing field list is long but every clause earns its place because there is no output schema to convey return shape.

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?

With no output schema, the description carries the full burden of describing returns, and it does so thoroughly — run identity, entrypoint, status semantics, trigger origin, timestamps, error, and output files. Combined with the schema's parameter docs, an agent has everything needed to invoke and interpret the call.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (projectId, pythonProjectId) are documented in the schema with their source tools. The description adds no syntax or format detail beyond that, so the baseline 3 is appropriate.

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?

Names a specific verb and resource (list Python runs), pins the scope (50 most recent, newest first, no paging), and explicitly identifies the sibling fastero_get_python_run_log as the consumer of the returned _id. An agent can distinguish this from the many other list_* siblings without opening a schema.

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

Usage Guidelines4/5

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

Clear context: this is the way to enumerate recent runs, and its _id feeds fastero_get_python_run_log, which routes the agent between the two. It also rules out paging. It stops short of an explicit when-to-use/when-not statement against other list tools, so it lands just below the top.

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

fastero_list_queriesList saved queriesA
Read-only
Inspect

List a project's saved queries, newest first, each with its _id (the queryId other query tools take), name, SQL text (string) and the connection it runs on (conn, with its name and type; null once that connection was deleted). Saved queries are what reports and alerts run. fastero_run_sql runs SQL without saving it.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare the read-only, non-destructive profile, and the description adds real behavioral context: results are ordered newest first, the _id is the queryId other tools accept, and conn is null once the connection is deleted. This output/nullability detail is valuable given there is no output schema.

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

Conciseness5/5

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

Three compact sentences, front-loaded with the core action and scope, then return fields, then the disambiguation. No filler.

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?

Despite no output schema, the description enumerates the returned fields and their semantics (name, SQL text, conn with name/type, nullability), plus ordering and the routing to run_sql. An agent has everything needed to call and interpret this list tool.

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

Parameters3/5

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

Schema coverage is 100% and the single projectId parameter is already documented as coming from fastero_list_projects. The description adds no further parameter syntax or format detail, so the baseline 3 applies.

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 (List) and resource (a project's saved queries) and immediately distinguishes itself from fastero_run_sql. An agent can identify the tool's scope without opening the schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent away from fastero_run_sql ('runs SQL without saving it'), clarifying the saved-vs-ad-hoc distinction. It does not mention other query siblings like fastero_get_query or fastero_create_query, so guidance is clear but not exhaustive.

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

fastero_list_reportsList reportsA
Read-only
Inspect

List the widgets (reports) in a project: each one's _id (the reportId other tools take), name, description, type (query, notebook, integration or file), widgetType and chartType, the saved query it reads (query) or its notebook cell (notebook, cellIndex), who made it and when. Text blocks are not listed: a dashboard's are in its items (fastero_get_dashboard). fastero_get_report reads one in full.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds real value by disclosing the returned field set and, importantly, the negative behavior that text blocks are omitted. It stops short of stating pagination or result-size behavior, which matters for a list tool.

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?

Three sentences, front-loaded with purpose, then return contents, then routing. The field enumeration is dense but each element is informative; there is no filler, though the middle sentence is long and could be parsed more easily as a list.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does so by naming the fields and the reportId linkage other tools need. The remaining gap is pagination/volume behavior for a list call, which an agent might need to know.

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

Parameters3/5

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

With one parameter at 100% schema coverage, the schema already explains projectId and its provenance (fastero_list_projects). The description adds no further constraint or format detail on the input; its detail about _id/reportId concerns output rather than the parameter.

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 description opens with a specific verb and resource ('List the widgets (reports) in a project') and then enumerates exactly which fields come back. It distinguishes itself from fastero_get_report (full read) and fastero_get_dashboard (text blocks), so an agent can separate it from the read-one siblings without inspecting schemas.

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

Usage Guidelines4/5

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

It explicitly routes the agent: use fastero_get_report to read one report in full, and go to fastero_get_dashboard for a dashboard's text blocks. That covers the main alternative and the exclusion, though it doesn't state when listing is preferable (e.g., discovery before update) or mention filtering/paging limits.

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

fastero_list_schedulesList schedulesA
Read-only
Inspect

List your own schedules in this organisation — dashboard emails, alerts, notebook runs and repeated agent runs — with each one's timetable, whether it is on, its next and last run, and the error from its last run if it failed. Each has the scheduleId fastero_set_schedule_enabled takes. The 100 newest are listed, and colleagues' schedules are not. A Python project's schedule, and a dashboard's automatic refresh, are triggers instead, in fastero_list_triggers.

NameRequiredDescriptionDefault
projectIdNoOnly this project’s schedules: a project’s id, from fastero_list_projects.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds real behavioural detail beyond them: a 100-item truncation cap, an ownership filter excluding colleagues, and that a failed run's error is surfaced. It stops short of auth requirements or pagination mechanics, so it is strong but not exhaustive.

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 action and scope in the first sentence, then routing constraints. The enumeration of schedule kinds is dense but each item earns its place by disambiguating siblings; the third sentence's trigger-vs-schedule distinction is the only part that could be tightened.

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?

With no output schema, the description correctly compensates by describing the return payload (timetable, enabled state, next/last run, last error). Combined with the scope limits and the sibling routing, an agent has everything needed to call this correctly.

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

Parameters3/5

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

The single parameter (projectId) is fully documented in the schema at 100% coverage, and the description does not restate or extend its meaning beyond the org-wide scope it already implies. Baseline 3 is appropriate when the schema does the heavy lifting.

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 ('List your own schedules') and then enumerates exactly which objects count (dashboard emails, alerts, notebook runs, repeated agent runs), which is critical for disambiguating from the many sibling list_* tools. It also names the field each item carries (scheduleId) and who consumes it (fastero_set_schedule_enabled).

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 scopes usage ('your own schedules', 'colleagues' schedules are not', 'the 100 newest are listed') and routes the agent away from this tool when the object is actually a trigger: 'A Python project's schedule, and a dashboard's automatic refresh, are triggers instead, in fastero_list_triggers.' That is a named alternative plus the condition that selects it.

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

fastero_list_secretsList secretsA
Read-only
Inspect

List the Secrets of the organization this key belongs to, to find the id fastero_update_secret takes or check a name before fastero_create_secret: each with its _id, name, type (text or file), the project or environment it is set on (neither means the whole organization), and when it was created and updated. Values are never returned, here or by any other tool, though a run’s own code can print one. Owners, admins and editors can list them; a viewer is refused.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/destructiveHint annotations by disclosing that values are never returned by any tool (though run code can print one), that listings are scoped to the key's organization, what fields are included, and the exact role requirements. This is the kind of context 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?

Purpose and alternatives are front-loaded in the first sentence, permissions at the end. It is somewhat dense and run-on in the middle ('each with its _id, name, type...'), but every clause adds real information.

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?

With no output schema and no parameters, the description compensates by describing the scope of the listing, the fields returned, the secrecy guarantee, and the permission gate. Nothing material is missing for correct invocation.

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?

Zero parameters, so the baseline is 4. The description usefully reinterprets the response fields (id, name, type, project/environment scope, timestamps), though it is not required to describe parameters.

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 ('List the Secrets of the organization this key belongs to') and explicitly names the sibling tools it serves (fastero_update_secret, fastero_create_secret). An agent can distinguish it from the other secret-related tools without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions: to find the id that fastero_update_secret takes, or to check a name before fastero_create_secret. It also states the permission model (owners/admins/editors can list, viewers are refused), which tells the agent when the call will fail.

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

fastero_list_streamlit_appsList Streamlit appsA
Read-only
Inspect

List a project's Streamlit apps, without their files: each with its appId (which the other Streamlit tools take), name, description, status as last recorded (stopped, starting, running or stopping), alwaysOn, errorMessage (why its last start failed, if it did), lastStarted, source ("files", or its Git provider, branch and sync state) and viewerUrl, the page a signed-in project member opens. Use it to find an app or see which are up. fastero_get_streamlit_app reads one app's files and checks its status against its server, and fastero_get_streamlit_app_logs reads its start-up output. Deleted apps are not listed. Any project member, viewers included, can list them.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description is fully consistent while adding substantial context the annotations cannot: deleted apps are excluded, and any project member including viewers can call it. It enumerates the returned fields and their semantics (status values, errorMessage, source/branch/sync state, viewerUrl), which matters because there is no output schema.

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?

Purpose and scope are front-loaded in the first clause, and nothing is redundant. The middle field enumeration is a long run-on list, but it earns its place given the absence of an output schema; slightly tighter grouping would read better.

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?

With no output schema, the description compensates by documenting the returned fields and their meanings, and it covers permissions, exclusions, and the alternatives. Nothing an agent needs in order to choose and call this tool is missing.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage pointing to fastero_list_projects, so the schema already carries the semantics. The description only implies the project scoping; it adds no format or sourcing detail beyond what the schema states. Baseline 3 applies.

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 ("List a project's Streamlit apps") plus an explicit scope qualifier ("without their files"), which immediately separates it from fastero_get_streamlit_app and the log reader. An agent can distinguish it from all siblings without opening any schema.

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?

"Use it to find an app or see which are up" gives the positive selection condition, and the next sentence names both alternatives with the exact cases that select them (reading files / checking live status vs. reading start-up output). It also states exclusions: deleted apps are not listed.

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

fastero_list_triggersList scheduled triggersA
Read-only
Inspect

List every trigger in the organization, whoever made it: Python schedules, dashboards’ and pages’ automatic refreshes, and watchers that react to a database, a Kafka topic or a webhook. Each comes with its _id (the triggerId fastero_enable_trigger and fastero_disable_trigger take), name, type and whether it is enabled; a timed one has its cron schedule, read in UTC. A schedule created by fastero_set_python_schedule is named py::, which is what identifies the file it runs, and its cron lives only here, not on the Python entrypoint. Dashboard emails, alerts and notebook runs are schedules instead, in fastero_list_schedules.

NameRequiredDescriptionDefault
orgIdNoThe organization’s id; it defaults to the organization this key belongs to, the only one it reaches.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds real context beyond that: which fields each item carries, that cron is read in UTC, and that the cron lives only here rather than on the Python entrypoint. It does not discuss volume/pagination for a list across the whole org, which is the main remaining gap.

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 scope and enumeration, then returns, then the sibling redirect. Dense and mostly waste-free, though the 'py:<pythonProjectId>:<entrypointId>' naming digression is lengthy relative to how often it matters.

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?

No output schema exists, and the description compensates by enumerating the returned fields (_id, name, type, enabled, cron) and their semantics. Combined with the sibling redirect and the UTC note, an agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

There is a single orgId parameter already documented at 100% schema coverage, including the default behavior, so the schema does the heavy lifting. The description never references orgId, but no additional meaning is needed given the schema text.

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 ('List every trigger in the organization') and enumerates the concrete trigger kinds covered: Python schedules, dashboard/page refreshes, and DB/Kafka/webhook watchers. It also names the distinguishing sibling (fastero_list_schedules) so the boundary is unambiguous.

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 the agent: 'Dashboard emails, alerts and notebook runs are schedules instead, in fastero_list_schedules.' It also connects the returned _id to fastero_enable_trigger and fastero_disable_trigger, telling the agent what to do with the output.

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

fastero_pin_notebook_cellPin notebook cellAInspect

Make a dashboard widget from a notebook cell's result, as the cell's Pin to Dashboard button does: a SQL cell's rows, or the table a Python cell shows last (a pandas DataFrame on its last line, or one passed to display()). The widget shows the rows of the notebook's latest run, so a notebook on a schedule (fastero_schedule_notebook) keeps it current, and dashboards, their shared links and emails, and pages show it like any widget. Run the notebook first (fastero_run_notebook) so the cell has a result. cellIndex counts from 0 over all the notebook's cells, markdown ones too, in the order fastero_read_notebook gives them. A chart needs assignments naming the columns it plots; table is the default. With dashboardId it is placed on that dashboard too. Returns the widget with its _id and url.

NameRequiredDescriptionDefault
nameYesThe widget’s title, shown above it.
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 } } } ] }
cellIndexYesThe cell, counting from 0 over all the notebook's cells, markdown ones too.
chartTypeNotable (the default), number, or a chart with its assignments: bar, horizontal_bar, stacked_bar, line, time_series, pie, scatter, waterfall, combo, heatmap, treemap, bubble. line or time_series for a measure over time; bar to compare categories (horizontal_bar for long labels, stacked_bar for the parts of each); pie or treemap for shares of one whole (a pie shows the 7 largest slices and groups the rest as Other); waterfall for steps that add up to a total; combo for two measures on different scales; scatter to relate two measures, bubble for three; heatmap for one measure across two categories.
projectIdYesThe project’s id, from fastero_list_projects.
changeNoteNoFor a Vega-Lite chart: what this change does and why, in a few words. People read it in Chart history.
notebookIdYesA notebook’s id, from fastero_list_notebooks.
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).
dashboardIdNoA dashboard’s id, from fastero_list_dashboards.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive mutation, and the description adds real context beyond them: the widget tracks the notebook's latest run, so scheduled runs keep it current, and it propagates to dashboards, share links, emails, and pages. It also states the return value (_id and url). It does not say whether re-pinning the same cell creates a duplicate widget or replaces the existing one, which is the main remaining behavioral gap.

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 action and its output, then prerequisites, then index semantics, then return value. Every sentence is relevant, though the cellIndex sentence partially duplicates the schema description and could be trimmed.

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

Completeness4/5

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

For a 9-parameter tool with a nested object and no output schema, the description covers the prerequisite, result-source semantics, index convention, chart-assignment requirement, optional dashboard placement, and the return shape. Minor gaps remain around duplicate-pinning behavior and non-tabular Python cell results, but nothing essential to calling it correctly is missing.

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

Parameters3/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. The description mostly restates schema content (cellIndex counting from 0 including markdown cells; charts need assignments naming plotted columns; table is the default). The one genuine addition is tying cell ordering to 'the order fastero_read_notebook gives them', which helps the agent derive a valid index.

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 ('Make a dashboard widget from a notebook cell's result') and pins down which cell results qualify (SQL rows, or the last table a Python cell shows, whether from a DataFrame on the last line or via display()). This is clearly distinct from siblings like fastero_save_chart, fastero_show_chart, and fastero_publish_widget_api.

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

Usage Guidelines4/5

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

Gives a concrete prerequisite ('Run the notebook first (fastero_run_notebook) so the cell has a result') and names the related schedule tool. It also explains that dashboardId optionally places the widget on a dashboard too. It never explicitly says when NOT to pin (e.g., versus saving a chart from a query), so it stops just short of full routing guidance.

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

fastero_publish_widget_apiPublish widget as APIA
Destructive
Inspect

Publish a widget's rows as a private web address another app or agent calls, read-only, without the database password: for a script or service that needs the numbers outside Fastero. For people to look at, fastero_share_dashboard publishes a dashboard's link instead. Only a query, spreadsheet or notebook-cell widget can be published (fastero_list_reports lists the widgets), and one already published is refused, with its address. A request to it carries the header X-Endpoint-Key: , and it answers { rows, lastUpdated, truncated }: rows at most five minutes old for a query widget; a spreadsheet widget's are its stored rows, and a notebook-cell widget's those of its notebook's last run, lastUpdated saying when. Anyone holding the key can read the rows until it is turned off (fastero_unpublish_widget_api). The organisation's owners are emailed about every publish. Returns widgetId, name, url, key, publishedAt and howToCall, a curl command; the key is in this answer only, since Fastero keeps just its hash. Owners, admins and editors of the project can publish.

NameRequiredDescriptionDefault
widgetIdYesA query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports).
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Well beyond the annotations: it discloses the response shape ({rows, lastUpdated, truncated}), the X-Endpoint-Key auth header, data-freshness semantics per widget type, that anyone holding the key can read until unpublished, that owners are emailed, and that the key is returned only once because only its hash is stored. These are exactly the non-obvious traits an agent cannot infer from destructiveHint/openWorldHint.

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 purpose and alternative, and nearly every clause carries new information (eligibility, freshness, key handling, return fields). It is a single dense paragraph with heavy clause-stacking, which slightly hurts scannability for an agent parsing it.

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?

A mutating, open-world tool with no output schema; the description compensates by covering permissions, side effects (owner email), response fields, auth mechanics, and the reversibility path via fastero_unpublish_widget_api. Nothing material needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are already documented, including the widget-type constraint and the fastero_list_projects pointer for projectId. The description repeats the widget-type rule but adds no new parameter-level meaning, so baseline 3 applies.

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 ('Publish a widget's rows as a private web address') plus the key scope qualifier ('read-only, without the database password'). It explicitly distinguishes itself from fastero_share_dashboard and fastero_unpublish_widget_api, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives the use case (a script or service needing the numbers outside Fastero), names the alternative and the condition selecting it (fastero_share_dashboard for people to look at), and states eligibility rules: only query, spreadsheet or notebook-cell widgets, and already-published ones are refused. Also names who may call it (owners, admins, editors).

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

fastero_read_fileRead project fileAInspect

Read an uploaded project file's contents. Text types (CSV, TSV, plain text, Markdown, HTML, XML, JSON, YAML) come back as text with encoding utf8; anything else, such as a spreadsheet, PDF, PNG, or a .py or .sql file, comes back whole and unparsed as base64 with its mimeType. A file over 1 MB is refused, saying its size. The first read of a file Fastero's assistant produced (a workbook, Word document, PDF or slides) counts against the plan's AI file downloads, and is refused once they are used up. A Python project's files are read with fastero_read_python_file.

NameRequiredDescriptionDefault
fileIdYesAn uploaded file’s id, from fastero_list_files.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Discloses rich behavior beyond annotations: text types return as utf8 text while everything else returns whole/unparsed base64 with mimeType, a 1 MB size cap, and quota consumption on first read of assistant-produced files. This context explains why readOnlyHint=false despite the 'read' verb, so no contradiction.

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-loads purpose, then encoding behavior, then limits and the alternative in a logical order. Dense but each clause carries distinct, useful information; slightly packed but not wasteful.

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?

With no output schema, the description still specifies the return format (utf8 text vs base64+mimeType), size limits, quota behavior, and the sibling alternative. Nothing an agent needs to call or interpret the result is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters (fileId, projectId) are already documented with their source list tools. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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+resource ('Read an uploaded project file's contents') and explicitly contrasts with the sibling 'fastero_read_python_file' for Python projects. An agent can distinguish it from the other read/list tools without opening a schema.

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?

Names the alternative tool (fastero_read_python_file) and the condition that routes to it (Python project files), and describes refusal conditions (over 1 MB, exhausted AI file downloads). The when-not guidance is explicit rather than inferred.

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

fastero_read_notebookRead notebookA
Read-only
Inspect

Read a notebook’s cells in order: code (Python, or SQL whose result becomes a DataFrame) and markdown, each code cell with the output saved from its last run. Nothing is run, and saved output can be large. fastero_write_notebook replaces the cells.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful non-obvious behavior: no execution occurs, output reflects the last run, and payloads may be large. It stops short of describing pagination or truncation handling for the 'large' output warning.

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

Conciseness5/5

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

Three tight sentences, front-loaded with what is read, then behavior (nothing run, output large), then the alternative tool. No filler and every sentence carries distinct information.

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

Completeness4/5

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

With no output schema, the description does the work of explaining the return shape (ordered cells, types, saved outputs), which is enough for an agent to know what to expect. It could say a bit more about output size limits or how large outputs are surfaced, but it is essentially complete for a two-param read tool.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (projectId, notebookId) are documented in the schema, including their source tools. The description adds no additional parameter meaning, so the baseline of 3 is appropriate.

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 (Read) and resource (a notebook's cells), and details what is returned: code cells (Python or SQL-to-DataFrame) and markdown, each code cell with its last saved output. It also names the sibling fastero_write_notebook, so an agent can distinguish read from write without opening either schema.

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

Usage Guidelines4/5

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

Gives a clear usage context – 'Nothing is run' and 'saved output can be large' tell the agent this is a static snapshot, not an execution. It names fastero_write_notebook as the mutation alternative, though it doesn't explicitly contrast with other read siblings like fastero_get_notebook_run or fastero_read_python_file.

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

fastero_read_python_fileRead Python fileA
Read-only
Inspect

Read one file of a Python project: a picture (PNG, JPEG, GIF or WebP), such as a chart a run saved in outputs/, comes back as an image with its mimeType, bytes and source; anything else as text. Text returns content, decoded as UTF-8, and source: local for a file stored in Fastero (written here, or saved by a run), git for one read from the linked repository's branch; a stored file is read in place of the repository's at the same path. Read a file here before fastero_write_python_file, which replaces the whole file; the path, relative to the project's root, comes from fastero_list_python_files. Uploaded project files such as spreadsheets are read with fastero_read_file, and notebooks with fastero_read_notebook. A file over 1,000,000 bytes is refused, with its size, rather than cut, since writing a cut copy back would lose the rest, and a path outside the project is refused. Any project member, viewers included, can read it.

NameRequiredDescriptionDefault
pathYesPath inside the project, e.g. 'main.py' or 'src/report.py'.
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond readOnlyHint: text is decoded as UTF-8, a 'source' field distinguishes local vs git and stored files shadow repository ones, a 1,000,000-byte file is refused with its size rather than truncated, and out-of-project paths are rejected. Permission scope ('any project member, viewers included') is also stated.

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 purpose and return shapes, and every clause carries information (limits, source semantics, alternatives). It is a single very dense paragraph with long run-on sentences, which costs some readability, but little could be cut without losing behavior an agent needs.

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?

There is no output schema, yet the description explains both return shapes and the fields they carry (mimeType, bytes, source, content). Combined with the size and path restrictions, an agent has everything needed to call it and interpret the result.

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 already 100%, so the baseline would be 3, but the description adds real meaning: the path is relative to the project root, comes from fastero_list_python_files, and paths outside the project are refused. That is more than the schema's bare example strings convey.

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

Purpose5/5

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

Opens with a specific verb and resource ('Read one file of a Python project') and immediately delineates the two return shapes (image vs text). It explicitly separates itself from fastero_read_file and fastero_read_notebook, so an agent can route correctly without opening a schema.

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?

Names the alternatives and the conditions selecting them: uploaded files go to fastero_read_file, notebooks to fastero_read_notebook. It also gives the sequencing rule ('Read a file here before fastero_write_python_file') and where to get the path (fastero_list_python_files).

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

fastero_rename_fileRename project fileA
DestructiveIdempotent
Inspect

Rename an uploaded project file. Only the name changes, and the old one is not kept: its contents, type and fileId stay, and everything built from it refers to it by fileId, so its dashboards keep working. The name cannot contain \ / : * ? " < > |. Answers with the fileId, the new name, the type, the size in bytes and when the file was last updated.

NameRequiredDescriptionDefault
nameYesThe new name with its extension, e.g. 'sales-2026.csv'.
fileIdYesAn uploaded file’s id, from fastero_list_files.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations give idempotentHint=true and destructiveHint=true, and the description complements them precisely: it says exactly what is lost (the old name is not kept) and what survives (contents, type, fileId, and dependent dashboards), plus name-character validation. It stops short of mentioning permissions or other behavioral traits, so 4 rather than 5.

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 verb and resource, then consequence, then validation, then return payload – no wasted sentences. Slightly dense with four clauses, but every one carries information an agent needs, including the return shape since no output schema exists.

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?

No output schema exists, and the description compensates by enumerating the response fields (fileId, new name, type, size, last-updated). Combined with the mutation semantics and validation rules, nothing needed to invoke or interpret the call is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by adding a real constraint: forbidden characters (\ / : * ? " < > |). The fileId/projectId descriptions are left entirely to the schema, which handles them adequately.

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 ("Rename an uploaded project file"), which distinguishes it cleanly from the nearby upload_file, delete_file and read_file siblings. An agent can identify the operation without opening the schema.

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

Usage Guidelines3/5

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

No explicit when-to-use/when-not-to-use statement or named alternative. The clause "everything built from it refers to it by fileId, so its dashboards keep working" implies renaming is safe versus re-uploading, but the agent must infer that this is preferable to a delete+upload cycle.

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

fastero_replace_streamlit_filesReplace Streamlit app filesA
DestructiveIdempotent
Inspect

Replace ALL of a Streamlit app's files with the ones sent — any file left out is deleted. It suits deploying a whole folder; fastero_write_streamlit_file changes one file. A running app picks up code changes in about 5 seconds; a changed requirements.txt applies on the next start. An app imported from Git keeps these edits across its starts until they're sent to its repository as a pull request, or discarded, from the app's workspace.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
filesYesThe app's files. Each is { name, content, path? }: name has no slashes, path is the folder inside the app ('.' — the default — for the top level). The platform always runs app.py at the top level, so include it; add requirements.txt for extra packages.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations: it spells out that omitted files are deleted (concretely confirming destructiveHint), that a running app reloads code in about 5 seconds while a changed requirements.txt applies on next start, and that Git-imported apps retain edits until a pull request is sent or the changes are discarded. This deployment timing and persistence context is not derivable from the structured fields.

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

Conciseness5/5

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

Three sentences with no filler, and the most consequential fact (omitted files are deleted) is front-loaded before the alternative and the runtime-behavior details.

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?

With no output schema, the description carries the full burden and does so: deletion semantics, reload/restart timing, and edit persistence for Git-imported apps are all covered, and required params are documented in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains appId, projectId, and the files array including name/path/content rules and the app.py/requirements.txt conventions. The prose does not add parameter syntax or constraints beyond that, so the baseline 3 applies.

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 ('Replace ALL of a Streamlit app's files') and immediately clarifies the destructive scope ('any file left out is deleted'), which distinguishes it from the sibling fastero_write_streamlit_file that changes a single file. An agent can select it without opening the schema.

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 scopes the use case ('It suits deploying a whole folder') and names the alternative and its contrasting behavior ('fastero_write_streamlit_file changes one file'). The routing decision between the two tools is fully stated.

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

fastero_report_page_errorReport page errorAInspect

Save an error that a hosted page's own code threw while the live page card drawn by fastero_show_page was showing it, so whoever fixes the page reads it in fastero_get_page's recentErrors. The card calls it, and it is marked app-only; it is not for reporting problems with Fastero itself. Besides adding the error, it only marks the page as changed now, which lists it first in fastero_list_pages. message is the error text: trimmed, cut to 500 characters, and refused when empty. The page keeps its last 5 errors, and fastero_update_page does not clear them; each person can save at most 10 a minute. Any project member, viewers included, can save one. Answers { ok: true }, or "Page not found" for a page deleted or not in this project.

NameRequiredDescriptionDefault
pageIdYesA hosted page’s id, from fastero_list_pages.
messageYesThe error text the page's code threw.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior4/5

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

Well beyond the annotations: it discloses the side effect of marking the page as changed (bumping it to the top of fastero_list_pages), the 500-character truncation and empty-message refusal, the 5-error retention with fastero_update_page not clearing them, a 10-per-minute-per-person rate limit, and viewer-level permissions. The only slight gap is that it says the tool answers { ok: true } but doesn't say what the failure shape looks like beyond the 'Page not found' string.

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 action and its consumer, then layered with constraints in descending importance. It is dense and long for a single paragraph, and 'The card calls it, and it is marked app-only' sits awkwardly next to the permission sentence later on, but nearly every clause carries non-redundant information.

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 3-parameter write tool with no output schema, the description covers the full contract: who calls it, side effects, message normalization, retention window, rate limit, authorization level, and the success/not-found responses. An agent has everything needed to call it correctly and to predict the consequences.

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 a 3, but the description adds real meaning: the message is trimmed, capped at 500 characters, and refused when empty — normalization and validation rules absent from the schema. It also clarifies that pageId refers to a page that may have been deleted or belong to another project, which explains the error path.

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 precise verb and resource — saving an error thrown by a hosted page's own code — and anchors it against siblings by naming fastero_show_page (the card), fastero_get_page (where it lands), and fastero_list_pages (ordering effect). It also carves out what it is not for: 'not for reporting problems with Fastero itself.' An agent can distinguish this from every other write tool in the sibling list.

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 identifies the caller ('The card calls it, and it is marked app-only') and the exclusion (not for Fastero's own problems), which tells an agent both who invokes it and when it should stay away. It even names the downstream consumer — whoever fixes the page reads it in fastero_get_page's recentErrors — so the routing decision is unambiguous.

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

fastero_revoke_dashboard_shareRevoke dashboard public linkA
DestructiveIdempotent
Inspect

Turn off a dashboard's public link, or withdraw one still awaiting confirmation. Use it to take access back from everyone holding the link; it takes effect at once, and opening the link then gives a not-found page. Asking again afterwards with fastero_share_dashboard makes a new link, at a new address, that waits for confirmation like any other. A dashboard with no link is left as it is. Needs an Owner, Admin or Editor role in the project. Returns { ok: true }.

NameRequiredDescriptionDefault
projectIdYesThe project the dashboard is in: its id, from fastero_list_projects.
dashboardIdYesThe dashboard whose public link this is: its id, from fastero_list_dashboards.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructive/idempotent, and the description adds genuinely new context: revocation is immediate, the old URL returns not-found, a subsequent share generates a new address that awaits confirmation, and no-op behavior on linkless dashboards. It also states the required Owner/Admin/Editor role and the return value, which annotations cannot convey.

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 action and effect, and every sentence carries information the agent could not infer. It is somewhat dense — six clauses in one paragraph — but nothing is filler.

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 two-parameter mutation with no output schema, the description covers effect timing, downstream consequences, re-share behavior, auth requirements, and the return shape. An agent has everything needed to call it and to explain the outcome.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their provenance (fastero_list_projects / fastero_list_dashboards). The description adds nothing about the parameters themselves, so the schema does all the work — baseline 3.

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 ('Turn off a dashboard's public link') and adds the pending-confirmation variant, so the exact effect is unambiguous. It is clearly distinguishable from fastero_share_dashboard (creates a link) and fastero_get_dashboard_share_link (reads one).

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 frames the use case ('take access back from everyone holding the link') and names the alternative — re-sharing via fastero_share_dashboard creates a new link at a new address. It also covers the when-not case: a dashboard with no link is left unchanged.

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

fastero_run_notebookRun notebookA
Destructive
Inspect

Run every cell of a notebook once, now, top to bottom, using compute; the cells read the organisation's and project's Secrets as environment variables. It runs the notebook as last saved (fastero_write_notebook saves cells), not edits unsaved in someone's open editor. The reply comes back at once with a runId while the run goes on in the background: fastero_get_notebook_run reports how it went, and fastero_read_notebook has the outputs, saved into the notebook, once it has finished. A run already in progress for the notebook is returned instead of starting a second. Waking a sleeping notebook server can add about a minute. To run it on a timetable, fastero_schedule_notebook. Owners, admins and editors of the project can run it; a notebook not in this project answers "Notebook not found".

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: asynchronous semantics (immediate runId, background execution), a dedupe rule that returns an existing in-progress run, a ~1-minute cold-start latency penalty, secrets injected as environment variables, and that it runs the last saved version. The annotations already flag destructiveHint=true; the description reinforces this by noting outputs get saved into the notebook, but it never states that existing saved outputs are overwritten, which would fully justify the destructive flag.

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 action and tightly packed with decision-relevant facts; almost every clause carries information. It is on the dense side, with several concerns (execution, versioning, async, dedupe, latency, auth) chained together, which slightly hurts scanability.

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?

Covers the full lifecycle an agent needs: how to start, how to poll (fastero_get_notebook_run), where outputs land (fastero_read_notebook), permissions, error behavior, and latency expectations. With no output schema, the description correctly explains that the immediate return is only a runId.

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 meaning: projectId scopes both the secrets injected and the permission check, and a notebook outside the project returns 'Notebook not found'. That ties the parameters to observable behavior rather than just restating their types.

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 concrete verb and resource plus scope: 'Run every cell of a notebook once, now, top to bottom, using compute.' It explicitly distinguishes itself from fastero_write_notebook (unsaved editor edits), fastero_schedule_notebook (timetable) and fastero_get_notebook_run (status), so an agent can route correctly without opening any schema.

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?

Names the alternatives and the conditions that select them: use fastero_schedule_notebook for a timetable, fastero_get_notebook_run to poll the outcome, fastero_read_notebook for the outputs once finished. It also states the eligibility rule (owners, admins, editors) and the deduplication behavior for an in-progress run.

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

fastero_run_python_projectRun Python projectA
Destructive
Inspect

Start one run of a Python project's entrypoint now: it is queued, then runs as a script on a machine of its own with the organisation's and project's Secrets as environment variables, using compute. Returns the run at once, with its _id (the runId) and status queued; fastero_list_python_runs follows its status (queued, starting, running, then succeeded, failed or cancelled) and error, and fastero_get_python_run_log reads what it printed once it has finished. entrypointId defaults to 'main', which a local project has from the start. A project linked to a repository in the Fastero app starts with an entrypoint for each of its scripts, named after the file; one linked with fastero_create_python_project starts with none, and fastero_ensure_python_entrypoint adds one. An entrypoint the project lacks is refused ("Unknown entrypointId"), and fastero_get_python_project lists those it has. To run it on a timetable, fastero_set_python_schedule. A deleted project answers "Project not found". Owners, admins and editors of the project can start runs.

NameRequiredDescriptionDefault
projectIdYesThe project’s id, from fastero_list_projects.
entrypointIdNoAn entrypoint's id, from fastero_ensure_python_entrypoint or the entrypoints in fastero_get_python_project; a 'local' project has 'main', the default.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds substantial context beyond them: the run is queued, executes as a script on its own machine, consumes compute, inherits organisation and project Secrets as environment variables, and returns immediately with an _id and queued status. It also documents failure modes ('Unknown entrypointId', 'Project not found'). It could have said more about cost or concurrency limits on the destructive compute consumption, which keeps it from a 5.

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 action and its async contract before branching into entrypoint and sibling guidance. Dense and information-rich, but the middle entrypoint discussion is a long run-on chain of clauses that could be tightened without losing content.

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 fire-and-forget async mutation with no output schema, the description covers the return shape (run id plus queued status), the follow-up tools for polling and logs, entrypoint resolution, permissions, and error cases. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns above that by explaining entrypointId's default ('main'), which project types start with entrypoints and which start with none, and what happens when the id is unknown. projectId and pythonProjectId are left to the schema, which already documents their sources.

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 ('Start one run of a Python project's entrypoint now') and immediately contrasts with the sibling scheduling tool. An agent can distinguish it from fastero_run_notebook, fastero_set_python_schedule, and fastero_list_python_runs without opening a schema.

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 names the alternatives and the condition that selects each: fastero_list_python_runs for status, fastero_get_python_run_log for output, fastero_set_python_schedule for timetables, fastero_ensure_python_entrypoint when an entrypoint is missing. It also states the permission prerequisite ('Owners, admins and editors').

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

fastero_run_sqlRun SQLA
Read-only
Inspect

Run a read-only query against one of this organisation's connected databases — PostgreSQL, MySQL, SQL Server, Redshift, Snowflake, Oracle, BigQuery or Google Sheets, or an uploaded CSV or Excel file made queryable with fastero_create_file_connection (DuckDB) — in that connection's own SQL dialect, and return rows. One SELECT, WITH, EXPLAIN or SHOW statement; a statement that could change data is refused. It returns at most 500 rows and about 100 KB: a larger result comes back cut, with truncated: true and totalRows, so prefer a LIMIT or an aggregate. Where a question involves a business number (revenue, churn, active users…), fastero_get_definitions holds this organisation's own expression for it.

NameRequiredDescriptionDefault
sqlYes
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnly/destructive=false, but the description adds real behavioral detail: which statement types are accepted, that data-changing statements are actively refused, and the hard return limits of 500 rows and ~100 KB with truncated:true and totalRows on cut results. That is exactly the extra context annotations cannot convey.

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 action and scope, then constraints, then the cross-tool tip — a logical order with little waste. It is dense, and the long dialect list inside the parenthetical is slightly heavy, but every clause carries information an agent needs.

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?

With no output schema, the description fully covers the return contract (rows, row/byte caps, truncated flag, totalRows) and the input contract (connectionId source, SQL forms, dialect). Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 50% (only connectionId is documented in-schema), so the description must carry the sql parameter — and it does, specifying the allowed single-statement forms and that it runs in the connection's own dialect. connectionId semantics are also reinforced ('from fastero_list_connections', file connections via fastero_create_file_connection). Minor gap: no mention of whether multiple statements separated by semicolons are rejected beyond the 'one statement' wording.

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 ('run a read-only query against ... connected databases'), enumerates the supported engines, and says it returns rows. An agent can immediately distinguish this from fastero_create_query, fastero_list_connections, or fastero_get_connection.

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

Usage Guidelines4/5

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

Gives concrete when-to-use context: one SELECT/WITH/EXPLAIN/SHOW statement, mutating statements refused, prefer LIMIT or aggregates, and route business-number questions to fastero_get_definitions. It also names fastero_create_file_connection as the way to make CSV/Excel queryable. The only gap is no explicit statement of when to persist a query via fastero_create_query instead of running it ad hoc.

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

fastero_run_streamlit_appStart Streamlit appA
Destructive
Inspect

Start a Streamlit app, or restart it if it is running. It uses compute while it runs. The reply comes back at once with status 'starting'; fastero_get_streamlit_app shows status 'running' once it is up (about 12 seconds typically, a few minutes when packages install), or errorMessage saying why the start failed, and fastero_get_streamlit_app_logs has the start-up output. A restart ends the sessions of anyone using the app. The app sleeps after the idle timeout it was made with, its organisation's setting at the time (10 minutes by default), and starts again when someone opens its link; whoever opens it first waits about 15 seconds while it starts. To spare them the wait, keep it always on with fastero_set_streamlit_always_on.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the call returns immediately with status 'starting', that readiness takes about 12 seconds (longer when packages install), that a restart terminates sessions of current users (matching destructiveHint), and that the app sleeps after the idle timeout. This is the kind of behavioral context annotations cannot convey.

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-loads the verb and the immediate-return behavior, then layers in timing, session impact, and the always-on alternative. It is dense but not wasteful, though the final sentence about cold-start waiting overlaps somewhat with the earlier idle-timeout sentence.

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?

With no output schema, the description correctly explains the return surface: immediate 'starting' status, later 'running' via fastero_get_streamlit_app, errorMessage on failure, and logs via fastero_get_streamlit_app_logs. Everything an agent needs to call it and interpret the result is present.

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

Parameters3/5

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

Schema description coverage is 100%, so both appId and projectId are already documented in the schema. The description adds no further meaning about parameter format or source beyond what the schema provides, so baseline 3 applies.

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 ('Start a Streamlit app') plus the restart nuance, which cleanly separates it from fastero_stop_streamlit_app and fastero_create_streamlit_app. An agent can identify the operation without opening the schema.

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

Usage Guidelines4/5

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

Explains the core use case (bring an app up) and points to a concrete alternative for avoiding cold starts: fastero_set_streamlit_always_on. It does not state explicit when-not conditions, but the guidance is clear enough to act on.

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

fastero_save_chartSave chart to dashboardAInspect

Keep a chart on a dashboard in one step: saves the query, makes the chart and adds it at the bottom of the dashboard. dashboard.id picks an existing dashboard; dashboard.name alone uses the project's dashboard of that name, or creates it. Same arguments as fastero_show_chart; the query must be read-only. Returns the new query’s and chart’s ids, and the dashboard’s id, name, url (the page where a signed-in member opens it) and whether it was created.

NameRequiredDescriptionDefault
sqlYesOne read-only statement returning one row per point: aggregate in SQL (GROUP BY), and ORDER BY the x axis.
titleYesThe chart’s title, as people will see 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.
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 } } } ] }
chartTypeNoline or time_series for a measure over time; bar to compare categories (horizontal_bar for long labels, stacked_bar for the parts of each); pie or treemap for shares of one whole (a pie shows the 7 largest slices and groups the rest as Other); waterfall for steps that add up to a total; combo for two measures on different scales; scatter to relate two measures, bubble for three; heatmap for one measure across two categories. number for a number card: over a series (assignments { date, value }, one row per period) it shows the latest value, its change against the previous period and a trend line.
dashboardYesWhere Save puts the chart; its button names it. { id, name } for an existing dashboard (fastero_list_dashboards); { name } alone for a new one, which Save creates.
projectIdYesThe project the chart is saved into if the person keeps it: a 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.
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).
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.
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.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false/destructiveHint=false, so the bar is lower; the description adds real context beyond them — it writes query and chart records, silently creates a dashboard when only a name is given, and requires read-only SQL. It doesn't mention whether repeated calls duplicate the chart or what permissions are needed, keeping it from a 5.

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?

Four tight sentences with the main effect front-loaded and the return contract last; nothing wasted. Slightly compressed prose ("Keep a chart") costs a touch of clarity in the opening clause.

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

Completeness4/5

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

Covers what the 18-parameter tool does, its one hard constraint (read-only SQL), dashboard resolution, and, absent an output schema, the exact return fields including url and created flag. It does not address idempotency or failure behavior for an invalid dashboard id.

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

Parameters3/5

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

Schema coverage is 100% and the nested dashboard object documents id-vs-name resolution itself, so the description's restatement of that rule adds little beyond the schema. Baseline 3 applies when the schema already carries the parameter semantics.

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 compound verb and resource: saves the query, makes the chart, adds it to the bottom of a dashboard. It directly contrasts with the sibling fastero_show_chart (which only previews) by saying it keeps the chart in one step, so an agent can distinguish the two without opening schemas.

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

Usage Guidelines4/5

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

The dashboard.id vs dashboard.name-alone rule gives explicit branching guidance, and "Same arguments as fastero_show_chart" plus "the query must be read-only" sets preconditions. It stops short of explicitly saying "use fastero_show_chart first to preview, then this to persist," leaving that routing implicit.

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

fastero_save_definitionSave a definitionA
DestructiveIdempotent
Inspect

Save or remove one shared definition, so every teammate's Claude and Fastero's assistant use it. kind is metric (expression: one aggregate SQL expression, e.g. SUM(CASE WHEN status = 'paid' THEN amount END)), dataset (table, fields with descriptions and isTime, primaryKey) or relationship (from and to dataset names, fromColumns and toColumns). Give connectionId when it only holds for one database, where it takes the place of one of its kind and name that holds for all; leave it out when it holds for all. The same kind and name for the same connection replaces the one saved before; remove: true deletes it. Every save is versioned. Save a definition when the user confirms what a number means, not on a guess.

NameRequiredDescriptionDefault
toNo
fromNo
kindYes
nameYes
grainNo
tableNoFor a dataset: the table, e.g. public.invoices.
fieldsNo
removeNo
synonymsNo
toColumnsNo
expressionNo
primaryKeyNo
descriptionNo
fromColumnsNo
connectionIdNoA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.
instructionsNoHow to use it, e.g. "exclude test accounts".

TDQS

A3.9/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing that same kind+name+connection replaces the prior definition, that remove: true deletes, and that every save is versioned — real mutation semantics that the destructiveHint flag alone doesn't convey. It stops short of saying whether prior versions are recoverable or what permissions are needed.

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

Conciseness3/5

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

Front-loaded and dense with useful content, but the connectionId sentence ('where it takes the place of one of its kind and name that holds for all') is a convoluted run-on that an agent may misparse. The kind-payload clauses are packed into one long parenthetical rather than structured per kind.

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

Completeness4/5

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

With 16 parameters and no output schema, the description covers the operation's core semantics and the discriminating fields. It leaves grain, synonyms, description and instructions unaddressed, which an agent filling in a dataset definition will need.

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 only 19%, and the description compensates well for the important fields: it explains the kind enum by giving the payload each kind expects (metric expression, dataset table/fields/isTime/primaryKey, relationship from/to/fromColumns/toColumns) and the connectionId scoping rule. Several parameters remain undocumented in both places — grain, synonyms, description, instructions — so it is not complete.

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

Purpose4/5

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

States a concrete verb and resource ('Save or remove one shared definition') and explains the effect ('every teammate's Claude and Fastero's assistant use it'), which is far more than a name restatement. It does not name the counterpart reader tool (fastero_get_definitions) to differentiate, which keeps it short of a 5.

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

Usage Guidelines4/5

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

'Save a definition when the user confirms what a number means, not on a guess' is an explicit trigger with an exclusion. It also gives a rule for when to supply connectionId versus omitting it. What's missing is how to handle an existing definition the agent wants to change rather than replace by name.

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

fastero_schedule_dashboard_emailSchedule dashboard emailA
Destructive
Inspect

Email a dashboard on a timetable to members of this organisation. Each run runs every query widget's query fresh (a widget pinned from a notebook cell shows its notebook's latest run, so schedule the notebook before the email) and emails each recipient the dashboard itself (its number cards, up to twelve charts as pictures, and each table's first ten rows) and a short summary, with a PDF of the whole dashboard attached and a button that opens the dashboard in Fastero after signing in. No public link is made; fastero_share_dashboard is the tool that publishes one. Recipients must be members of the organisation, up to 20, and an address outside it is refused: only a person can add one, in the Fastero app. Each recipient can stop this one report from a link in the email (only they can start it again); with no emails it goes to you. The cadence is at most once an hour, in the timezone given. Asking again for the same dashboard updates the timetable and recipients rather than adding a second schedule. If a run fails, only you are told. Given slackChannel, each run also posts the dashboard's name, a link to it and its charts as pictures to that channel of the organisation's Slack (no PDF), and it posts even when no recipient gets the email. Returns scheduleId, cadence, timezone, nextRunAt, recipients, slackChannel (the channel's id, when it posts to Slack) and created (false when it updated your existing schedule). fastero_set_schedule_enabled switches it off. Owners, admins and editors of the project can schedule one.

NameRequiredDescriptionDefault
emailsNoUp to 20 addresses, each belonging to a member of the organisation.
cadenceYesFive-field cron (minute hour day-of-month month day-of-week), at most once an hour, read in `timezone`. '0 9 * * 1' is 09:00 every Monday; '0 8 1 * *' is 08:00 on the 1st of each month.
timezoneYesIANA timezone the cadence is read in, e.g. 'Europe/Berlin' or 'America/New_York'.
projectIdYesThe project’s id, from fastero_list_projects.
dashboardIdYesA dashboard’s id, from fastero_list_dashboards.
slackChannelNoA Slack channel to post the dashboard's charts as pictures to as well, by name ('#metrics') or id. Slack must be connected to the organisation and Fastero in the channel: if it is not, the call is refused and says so, and someone types /invite @Fastero in the channel. Left out, the schedule keeps the channel it has; an empty string stops posting to Slack.

TDQS

A4.9/5.0
Behavior5/5

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

Discloses far beyond annotations: fresh query widget runs, notebook pinning caveat, exactly what the email contains (number cards, up to 12 charts, first 10 table rows, PDF, sign-in button), recipient unsubscribe behavior, failure notification routing ('only you are told'), hourly rate limit, Slack posting behavior including posting even with no email recipients, and the idempotent update-instead-of-duplicate behavior which is consistent with destructiveHint=true. No contradictions.

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 action in the first sentence, and every sentence carries distinct information. It is dense and run-on, with several behavioral clauses stacked into long sentences, which costs it a point but no sentence is truly 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 mutation/upsert scheduling tool with no output schema, the description enumerates returned fields (scheduleId, cadence, timezone, nextRunAt, recipients, slackChannel, created) and covers permissions, failure modes, Slack connection prerequisite, and rate limits. Nothing an agent needs to call it correctly is missing.

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?

Schema coverage is already 100%, but the description adds real semantics: 'at most once an hour, in the timezone given', 'with no emails it goes to you', and the slackChannel empty-string-vs-omitted distinction ('Left out, the schedule keeps the channel it has; an empty string stops posting to Slack'). That is genuine meaning beyond 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 (email/schedule) and resource (dashboard) with exact scope, and explicitly contrasts itself with fastero_share_dashboard ('No public link is made; fastero_share_dashboard is the tool that publishes one') and fastero_set_schedule_enabled. An agent can distinguish it from all siblings without opening schemas.

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 names alternatives (share_dashboard for public links, set_schedule_enabled to disable), states prerequisites (recipients must be org members, max 20, owners/admins/editors can schedule), and explains the upsert semantics of re-calling for the same dashboard. When-to-use and when-not-to-use are both covered.

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

fastero_schedule_notebookSchedule notebookA
Destructive
Inspect

Run every cell of a notebook on a timetable; to run it once now, fastero_run_notebook, and for a Python project's script, fastero_set_python_schedule. It uses compute on every run. If a run fails — the notebook cannot start, or any cell errors — you are told by email and in the app. A good run emails its last output to the recipients listed, who must be members of the organisation; with none listed a good run is silent, and its outputs stay in the notebook for fastero_read_notebook. The cadence is at most once an hour, in the timezone given. Asking again for the same notebook replaces your schedule of it: its timetable, and its recipients, none if emails is left out; a schedule switched off is switched back on. Returns scheduleId, cadence, timezone, nextRunAt, recipients and created. fastero_set_schedule_enabled switches it off. Owners, admins and editors of the project can schedule one.

NameRequiredDescriptionDefault
emailsNoUp to 20 addresses of organisation members to email a good run’s last output to; leave it out for a silent good run.
cadenceYesFive-field cron (minute hour day-of-month month day-of-week), at most once an hour, read in `timezone`. '0 9 * * 1' is 09:00 every Monday; '0 8 1 * *' is 08:00 on the 1st of each month.
timezoneYesIANA timezone the cadence is read in, e.g. 'Europe/Berlin' or 'America/New_York'.
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the destructiveHint annotation by spelling out the upsert semantics: re-scheduling the same notebook replaces the timetable and recipients, omitting emails clears recipients, and a disabled schedule is re-enabled. It also discloses compute consumption, failure email/in-app notification, and that owners/admins/editors may schedule.

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 purpose and the sibling routing, then behavior, then return shape — a sensible order. It is dense and slightly run-on (multiple clauses per sentence), but nearly every clause carries operational information rather than padding.

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 mutating, permission-gated scheduling tool with no output schema, the description covers permission requirements, cadence limits, replacement behavior, notification behavior, and even enumerates the return fields. An agent has everything needed to call it correctly and predict the consequences.

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 schema already carries the baseline, but the description adds real meaning: the cadence floor ('at most once an hour'), the timezone the cadence is read in, and the destructive consequence of omitting emails on a repeat call. That last point is not derivable from the schema alone.

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 precise verb and resource ('Run every cell of a notebook on a timetable') and immediately distinguishes itself from the two nearest siblings, fastero_run_notebook (one-off) and fastero_set_python_schedule (Python project scripts). An agent can pick the right tool without opening any schema.

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 attached ('to run it once now, fastero_run_notebook'; 'for a Python project's script, fastero_set_python_schedule'; 'fastero_set_schedule_enabled switches it off'). It also states the permission gate — owners, admins and editors of the project.

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

fastero_set_dashboard_refreshSet dashboard refreshA
Idempotent
Inspect

Set how a dashboard refreshes its charts for everyone who has it open: minutes (1, 5, 15 or 60; 0 turns it off), or when: 'change' to refresh when the data behind its charts changes. A hosted page's refresh is set with fastero_set_page_refresh instead, and fastero_disable_trigger pauses this one by its triggerId while keeping it. 'change' needs a chart whose query runs on Postgres or BigQuery, and a chart on a warehouse that bills each query (BigQuery, Snowflake, Athena, S3) makes 5 minutes the shortest timer; a value it cannot use is refused with the reason. Only open screens re-run their charts, and its public link re-takes its numbers when someone opens it; a scheduled email (fastero_schedule_dashboard_email) runs its own queries whatever is set here. Returns refresh, the setting now in force ({ triggerId, mode: timer or change, minutes }, or null when off), as fastero_get_dashboard reports it. Owners, admins and editors of the project can set it.

NameRequiredDescriptionDefault
whenNo'change': re-run whenever the data behind its charts changes (Postgres and BigQuery only).
minutesNoRe-run its charts every 1, 5, 15 or 60 minutes; 0 turns the timer off.
projectIdYesThe project’s id, from fastero_list_projects.
dashboardIdYesA dashboard’s id, from fastero_list_dashboards.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=false) by disclosing runtime behavior: only open screens re-run their charts, public links re-take numbers on open, scheduled emails run their own queries regardless, and unusable values are refused with a reason. It also states the authorization tier required to perform the write.

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 core action and its two modes are front-loaded, and each clause carries distinct information (scope, alternatives, constraints, return value, permissions). It is a single dense block, though; the return-value and permission clauses could be broken out for easier scanning.

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?

No output schema exists, and the description compensates by specifying the return shape ({ triggerId, mode, minutes } or null when off) and framing it relative to fastero_get_dashboard. Combined with permissions and the mutation's effect on open screens, an agent has everything needed to invoke it correctly.

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% and both enums are documented, so the baseline would be 3. The description earns more by supplying cross-parameter constraints absent from the schema: 'change' requires a chart querying Postgres or BigQuery, and a warehouse that bills per query forces a 5-minute floor on the timer.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Set how a dashboard refreshes its charts for everyone who has it open', and immediately enumerates the two supported modes (minutes or 'change'). It explicitly names the sibling it is not (fastero_set_page_refresh for hosted pages), so the agent can distinguish it without opening either schema.

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?

Names concrete alternatives and the conditions that select them: fastero_set_page_refresh for a hosted page, fastero_disable_trigger to pause while keeping the setting, and fastero_schedule_dashboard_email as an independent path. It also states prerequisites (Postgres/BigQuery chart for 'change', owners/admins/editors only), leaving little to inference.

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

fastero_set_job_callbackSet a job callbackA
DestructiveIdempotent
Inspect

Make a job call a registered destination when it fails, finishes, or its alert fires — for example, a Claude Code routine that starts when a scheduled Python project fails. destinationName is a name from fastero_list_callback_destinations, never an address. jobType is python_project (jobId from fastero_list_python_projects; entrypointId limits it to one entrypoint) or task_schedule (a scheduled dashboard email, notebook run or alert; jobId from fastero_list_schedules). events: failed and succeeded; for an alert, alert (it fires or recovers) and failed (its check could not run). Setting it again replaces the events; remove: true detaches the destination from the job. A Claude routine is started once per event at most, and at most 25 times an hour.

NameRequiredDescriptionDefault
jobIdYesThe job’s id: a Python project’s, from fastero_list_python_projects, or a schedule’s, from fastero_list_schedules.
eventsNo
removeNotrue detaches the destination from the job.
jobTypeYes
entrypointIdNoPython projects only: one entrypoint’s id, from the entrypoints in fastero_get_python_project.
destinationNameYesA destination’s name, from fastero_list_callback_destinations.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=true), it discloses non-obvious behavior: re-setting replaces the events, remove:true detaches the destination, and a Claude routine is rate-limited to once per event and at most 25 times an hour. This is exactly the extra context 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?

The purpose and the key constraint (destinationName is a name, not an address) are front-loaded, and each clause carries information. It is a dense single paragraph that could be broken up for scanability, which keeps it from a 5.

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 6-parameter mutation tool with no output schema, the description supplies everything an agent needs: id sources per jobType, event semantics, replacement/detach behavior, and rate limits. No gaps remain that would cause a mis-call.

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?

It adds meaning beyond the 67% schema coverage: destinationName is 'a name... never an address', entrypointId 'limits it to one entrypoint', and the events semantics for alerts (alert fires or recovers, failed means the check could not run) go well past the bare enum. Only remove:true is essentially repeated from 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?

The opening sentence states a specific verb and resource ('Make a job call a registered destination when it fails, finishes, or its alert fires') plus a concrete example. It is the only callback-setting tool among the siblings, and the description makes its role unambiguous without opening any schema.

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

Usage Guidelines4/5

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

It routes the agent to the correct source tools for each id (fastero_list_callback_destinations, fastero_list_python_projects, fastero_list_schedules) and explains the two jobType paths. It does not explicitly state when not to use the tool, but with no direct sibling alternative the contextual guidance is strong.

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

fastero_set_page_refreshSet page refreshA
Idempotent
Inspect

Set how a hosted page refreshes its numbers for everyone who has it open: minutes (1, 5, 15 or 60; 0 turns it off), or when: 'change' to refresh when the data behind its widgets changes. A dashboard's refresh is set with fastero_set_dashboard_refresh instead, and fastero_disable_trigger pauses this one by its triggerId while keeping it. 'change' needs a widget whose query runs on Postgres or BigQuery, and a page that has one gets it from the start; a widget on a warehouse that bills each query (BigQuery, Snowflake, Athena, S3) makes 5 minutes the shortest timer. A value it cannot use is refused with the reason. Only open screens re-read their rows. Returns refresh, the setting now in force ({ triggerId, mode: timer or change, minutes }, or null when off). Owners, admins and editors of the project can set it.

NameRequiredDescriptionDefault
whenNo'change': re-run whenever the data behind its charts changes (Postgres and BigQuery only).
pageIdYesA hosted page’s id, from fastero_list_pages.
minutesNoRe-run its charts every 1, 5, 15 or 60 minutes; 0 turns the timer off.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the mutation/safety profile (readOnly=false, idempotent=true), and the description adds context annotations cannot carry: minimum timer restrictions on billed warehouses, invalidation rules ('A value it cannot use is refused with the reason'), the fact that only open screens re-read rows, and the role requirements for callers.

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?

Dense but front-loaded: the core behavior comes first, followed by alternatives, constraints, and return shape. Every sentence carries information, though the middle section is a long run of constraints that could be broken up for readability.

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?

With no output schema, the description still documents the return shape ({ triggerId, mode, minutes } or null) and the failure mode (refusal with reason). Combined with parameter and permission notes, an agent has everything it needs to call this correctly.

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 baseline is 3; the description still adds meaning beyond the schema by explaining that 0 disables the timer and that 'change' is constrained by the underlying widget's warehouse.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Set how a hosted page refreshes its numbers for everyone who has it open.' It also names the sibling it is not (fastero_set_dashboard_refresh), so the agent can distinguish page refresh from dashboard refresh immediately.

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 the agent: dashboards go to fastero_set_dashboard_refresh, pausing goes to fastero_disable_trigger, and this tool is the page-level setting. It also states prerequisites ('change' needs a Postgres/BigQuery widget) and permission requirements, leaving nothing to inference.

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

fastero_set_python_scheduleSet Python scheduleA
DestructiveIdempotent
Inspect

Run a Python entrypoint repeatedly on a cron timetable, or change the one it has: an entrypoint has one schedule, and calling again replaces its cron and whether it is on. The cron expression takes 5 fields (minute hour day-of-month month day-of-week) or 6 with leading seconds, and runs in UTC — there is no per-schedule timezone; an expression the scheduler cannot run is refused. A scheduled run cannot be given parameters: it runs the entrypoint as it stands. Each run uses compute, and a failed one is reported to you by email and in the app. The entrypoint id comes from fastero_ensure_python_entrypoint or fastero_get_python_project. With emails or slackChannel, each successful scheduled run also sends the pictures it saved in outputs/ (PNG, JPEG, GIF or WebP) there; a run started by hand sends none. Left out, they stay as they are. Returns ok, triggerId, schedule (the cron as stored), and emails and slackChannel when set. It is the trigger py::, which fastero_list_triggers shows and fastero_disable_trigger pauses. To run once now, fastero_run_python_project; a notebook is scheduled with fastero_schedule_notebook. Owners, admins and editors of the project can set it.

NameRequiredDescriptionDefault
emailsNoWho is emailed the pictures: up to 20 addresses, each belonging to a member of this organisation; an address outside it is refused. An empty list stops the emails.
enabledNoWhether the schedule starts running now. Defaults to true; pass false to create it paused.
scheduleYesCron expression in UTC, 5 or 6 fields. '0 9 * * 1' is 09:00 UTC each Monday. A 4-field value is read as day-of-week omitted.
projectIdYesThe project’s id, from fastero_list_projects.
entrypointIdYesThe entrypoint to run, e.g. 'main'. Returned by fastero_ensure_python_entrypoint.
slackChannelNoA Slack channel to post the pictures to, by name or id, which Fastero must be in: type /invite @Fastero there first. Slack must be connected in Fastero. '' stops the posts.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (idempotentHint/destructiveHint): one schedule per entrypoint, a repeat call overwrites cron and enabled state, no per-schedule timezone, invalid cron rejected, scheduled runs take no parameters, compute is consumed per run, failures are emailed and surfaced in the app, and omitting emails/slackChannel leaves existing values untouched. Annotations alone would not tell an agent any of this.

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?

Dense but front-loaded: the core action and its overwrite semantics come first, then cron rules, then notification behavior, then id derivation and alternatives. Nearly every clause carries operational information; only the trailing permission sentence could be trimmed slightly.

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 7-parameter mutation tool with no output schema, the description supplies the return shape (ok, triggerId, schedule, emails, slackChannel), the trigger identifier format, error/refusal behavior, and permission requirements. Nothing an agent needs to invoke it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: the cron field count/UTC interpretation and refusal behavior, the fact that a scheduled run cannot be parameterized, and the crucial rule that omitted emails/slackChannel are preserved rather than cleared. That omission rule is genuinely beyond what the schema says.

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

Purpose5/5

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

Opens with a specific verb and resource: run a Python entrypoint repeatedly on a cron timetable or replace its existing schedule. It explicitly contrasts with fastero_run_python_project (run once) and fastero_schedule_notebook (notebooks), so an agent can separate it from the closest siblings without inspecting schemas.

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?

Names concrete alternatives and the condition that selects each: fastero_run_python_project for a single run, fastero_schedule_notebook for notebooks, fastero_disable_trigger to pause, fastero_list_triggers to inspect. It also states where the required ids come from (fastero_ensure_python_entrypoint, fastero_get_python_project) and which roles may call it.

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

fastero_set_schedule_enabledTurn schedule on or offA
Idempotent
Inspect

Switch one of your own schedules off, or back on: a dashboard email, alert, notebook run or repeated agent run. Off stops its runs and its emails at once (a run under way finishes); on resumes the same timetable from now, without making up missed runs. A colleague's schedule cannot be switched. A Python schedule, or a dashboard's automatic refresh, is a trigger instead: fastero_disable_trigger.

NameRequiredDescriptionDefault
enabledYesfalse switches it off, true back on.
scheduleIdYesA schedule’s id, from fastero_list_schedules.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare that this is a non-read-only, idempotent, non-destructive mutation; the description adds the semantics that matter, namely that off halts runs and emails immediately while letting an in-flight run finish, and that on restarts the timetable from now without backfilling missed runs. Those consequences are not derivable from the annotations or schema.

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

Conciseness5/5

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

Every sentence carries a distinct piece of operational information 3 the action, the effect of off, the effect of on, the ownership restriction, and the routing alternative. It is front-loaded with the action and contains no filler.

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 two-parameter toggle with no output schema and annotations covering the safety profile, the description supplies everything an agent needs: which schedules it applies to, what state change means, side effects on in-flight runs, and where to go for triggers.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are described there (enabled as false/true, scheduleId as coming from fastero_list_schedules). The description restates the off/on meaning but adds no format, id syntax, or edge-case detail beyond the schema, so the baseline of 3 applies.

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 (switch a schedule on/off) and enumerates the concrete object types it governs: dashboard email, alert, notebook run, repeated agent run. It also explicitly distinguishes itself from the trigger tools, so an agent can separate it from fastero_disable_trigger/fastero_enable_trigger without opening a schema.

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

Usage Guidelines5/5

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

Gives both positive and negative conditions: it works only on your own schedules, a colleague's schedule cannot be switched, and Python schedules or a dashboard's automatic refresh must go through fastero_disable_trigger instead. It also points at fastero_list_schedules as the source of the id.

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

fastero_set_streamlit_always_onSet Streamlit app always-onA
Idempotent
Inspect

Keep a Streamlit app running when nobody is using it (alwaysOn true), so whoever opens it next does not wait for it to start, or let it sleep when idle again (false), which uses no compute while it sleeps. It does not start a stopped app: fastero_run_streamlit_app does. Always-on is a Pro feature, and a new account's first 14 days of Pro include it: on the Free plan, switching it on is refused with a message naming the billing page where the plan can be upgraded, and an account whose Pro days end without a paid plan has it switched off. Turning it off always works. Returns the app's settings with alwaysOn as it now is. Owners, admins and editors of the project can change it.

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
alwaysOnYestrue keeps it running when idle; false lets it sleep again after the idle timeout.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses plan gating (Pro feature, 14-day trial), the exact failure mode on Free (refused with a message pointing at billing), the auto-downgrade when Pro days lapse, that turning it off always works, required roles, and the return value. None of this is recoverable from readOnlyHint/idempotentHint alone.

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-loads the core behavior and its complement, then layers exemptions, plan gating, and permissions in a logical order. It is dense but nearly every clause carries a fact an agent needs; the billing/plan sentence is the only one that could be trimmed slightly.

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 three-parameter idempotent toggle with no output schema, the description covers the state transition, the failure case, the downgrade behavior, the permission model, and the returned shape ('the app's settings with alwaysOn as it now is'). Nothing required to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and each parameter is already documented, including the true/false semantics of alwaysOn. The description restates the boolean meaning but adds no syntax, format, or constraint information beyond the schema, so the baseline 3 applies.

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 (set always-on for a Streamlit app) and immediately defines both directions of the toggle. It also explicitly distinguishes itself from fastero_run_streamlit_app, so an agent can tell the two apart without inspecting schemas.

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

Usage Guidelines5/5

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

Gives a clear when/when-not: use this to keep an idle app warm or let it sleep, and it explicitly says 'It does not start a stopped app: fastero_run_streamlit_app does.' The named alternative removes any ambiguity about which sibling to call.

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

fastero_share_dashboardPublish dashboard public linkA
Destructive
Inspect

Ask for a dashboard's public link, or refresh one already published. Only dashboards have public links; to share with particular people who sign in, use fastero_invite_to_project. A dashboard with no published link is not made public by this call: its link waits, serving a not-found page, until a signed-in Owner, Admin or Editor of the project confirms it at confirmUrl, a page in Fastero that names the dashboard and says anyone with the link can open it without signing in. Confirming publishes a snapshot with each widget's query run live. The request lapses after 7 days, and calling again while it waits changes nothing. A link already published is refreshed at once, with no new confirmation: each call takes a new snapshot of the dashboard as it then stands, widgets added since included (a widget whose query fails keeps its last cached rows), and with the dashboard's refresh on (fastero_set_dashboard_refresh), its numbers are re-taken when someone opens it. Needs an Editor role or above in the project. A dashboard with no widgets is refused (409). Returns status 'awaiting_confirmation' with confirmUrl and expiresAt, or 'published' with shareUrl, the link itself ('none' when the link changed while this ran, for example it was revoked); and live, how the published link re-takes its numbers, or null.

NameRequiredDescriptionDefault
projectIdYesThe project the dashboard is in: its id, from fastero_list_projects.
dashboardIdYesThe dashboard whose public link this is: its id, from fastero_list_dashboards.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations flag destructive/openWorld but say nothing about the mechanics; the description supplies them: the link stays unpublished until a signed-in Owner/Admin/Editor confirms at confirmUrl, the request expires in 7 days, confirming publishes a live-query snapshot, refreshes are immediate with no re-confirmation, failed widget queries fall back to cached rows, and refresh settings interact with fastero_set_dashboard_refresh.

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 action and the sibling distinction, and every sentence carries substantive behavior. It is dense to the point of run-on in the confirmation paragraph, which costs readability, but little is filler.

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?

There is no output schema, and the description fully covers returns: status 'awaiting_confirmation' with confirmUrl and expiresAt, or 'published' with shareUrl (including the 'none' edge case), plus the 'live' field. Combined with the confirmation and refresh model, an agent has everything needed to call and interpret it.

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

Parameters3/5

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

Schema coverage is 100% and both parameters already document their source (fastero_list_projects, fastero_list_dashboards), so the description adds nothing extra about them. Baseline 3 applies since the schema carries the parameter burden.

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 plus the dual mode: 'Ask for a dashboard's public link, or refresh one already published.' It also draws the boundary against fastero_invite_to_project and implicitly against fastero_get_dashboard_share_link, so an agent can separate it from siblings without reading schemas.

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 the agent: use fastero_invite_to_project for signed-in sharing, use this for public links, and it clarifies that calling again while a request is pending changes nothing. It also names the prerequisite role (Editor or above) and the 409 case for empty dashboards.

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

fastero_show_chartShow chartA
Read-only
Inspect

Show a chart of a read-only query to the person, inside the conversation. Nothing is saved: the chart has a Save button that puts it on the dashboard you name, or fastero_save_chart with the same arguments saves it. dashboard names where Save puts it: the one being worked on, or a short new name if there is none. For a chart chartType can’t say, vegaLite instead of chartType and assignments: the answer then also holds the picture and a report of likely mistakes, so look at them and correct the chart before going on.

NameRequiredDescriptionDefault
sqlYesOne read-only statement returning one row per point: aggregate in SQL (GROUP BY), and ORDER BY the x axis.
titleYesThe chart’s title, as people will see 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.
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 } } } ] }
chartTypeNoline or time_series for a measure over time; bar to compare categories (horizontal_bar for long labels, stacked_bar for the parts of each); pie or treemap for shares of one whole (a pie shows the 7 largest slices and groups the rest as Other); waterfall for steps that add up to a total; combo for two measures on different scales; scatter to relate two measures, bubble for three; heatmap for one measure across two categories. number for a number card: over a series (assignments { date, value }, one row per period) it shows the latest value, its change against the previous period and a trend line.
dashboardNoWhere Save puts the chart; its button names it. { id, name } for an existing dashboard (fastero_list_dashboards); { name } alone for a new one, which Save creates.
projectIdYesThe project the chart is saved into if the person keeps it: a 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.
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).
connectionIdYesA data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file.
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.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false; the description reinforces this with 'Nothing is saved' and explains the practical consequence – a Save button and a SAVE-time dashboard target. It also discloses that the vegaLite path returns the rendered picture plus a report of likely mistakes, which is meaningful behavior beyond the annotations. No contradiction with the read-only hint.

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?

Four sentences, front-loaded with purpose and the save alternative before the vegaLite caveat. Some phrasing is dense and slightly awkward ('For a chart chartType can’t say'), but nothing is padding given an 18-parameter tool.

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

Completeness3/5

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

There is no output schema, and the description only explains what comes back on the vegaLite branch; for the ordinary chartType path it never says what the answer contains (confirmation, rendered chart, validation errors). For a tool with nested objects and 18 parameters, the behavioral picture is adequate but leaves the return value of the common path to inference.

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 meaning: dashboard defaults to the dashboard being worked on or a short new name, and vegaLite replaces chartType and assignments and changes what comes back. It stays focused on the parameters an agent most often gets wrong rather than restating 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: show a chart of a read-only query to the person, inside the conversation. It explicitly separates itself from fastero_save_chart by saying nothing is saved and naming save_chart as the persisting alternative, so the agent can pick between them without opening a schema.

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

Usage Guidelines4/5

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

The show-versus-save choice is implied clearly (Save button or fastero_save_chart with the same arguments), and the vegaLite branch states when to use it over chartType ('only for a chart chartType can't say'). It stops short of an explicit when-not rule for the inline preview itself, but the routing context is strong.

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

fastero_show_pageShow pageA
Read-only
Inspect

Show a hosted page live in the conversation: a card that draws it with its current numbers, a Refresh button and a link to open it in Fastero. Answers with the page's name, how many widgets it has and its link; the HTML and the numbers go to the card, not to you, and a client that draws no cards shows just that answer. To read or change the HTML, fastero_get_page and fastero_update_page.

NameRequiredDescriptionDefault
pageIdYesA hosted page’s id, from fastero_list_pages.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and destructiveHint=false; the description goes well beyond by disclosing that HTML and numbers are rendered to the card rather than returned to the agent, and that card-less clients receive only the plain answer. This is exactly the kind of side-effect and transport behavior an agent cannot infer from annotations or schema.

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 action and the card behavior, and the closing alternative-routing sentence earns its place. It is somewhat clause-heavy with commas and a semicolon, but no sentence is filler.

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?

With no output schema, the description compensates by describing the return value (page name, widget count, link) and what happens in card-less clients. Combined with the card-rendering behavior, an agent has everything needed to call and interpret this tool.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are documented with provenance ('from fastero_list_pages', 'from fastero_list_projects'), so the schema carries the burden. The description adds no parameter-level syntax or formatting detail, making a baseline 3 appropriate.

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 ('Show a hosted page live in the conversation') and immediately characterizes the result as a rendered card with current numbers, a Refresh button and an open link. This clearly separates it from siblings like fastero_get_page and fastero_update_page, which are named explicitly.

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 the agent: to read or change the HTML, use fastero_get_page and fastero_update_page. That names the alternatives and the condition selecting them, so an agent knows when not to call this tool without further inference.

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

fastero_show_reportShow reportA
Read-only
Inspect

Look at a saved chart: its picture, as an image, from its rows as you may see them, with its row count. For a Vega-Lite chart, also a report of likely mistakes: columns the rows lack, marks that drew nothing, bars in alphabetical order, text that may overlap or vanish. Nothing is changed. To change the chart, fastero_update_report. A widget that is not a chart is refused.

NameRequiredDescriptionDefault
reportIdYesA report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Nothing is changed' is largely redundant. The description earns credit for beyond-annotation behavior: rows are permission-scoped ('as you may see them'), non-chart widgets are rejected, and the diagnostics cover specific failure modes (missing columns, empty marks, alphabetical bars, overlapping text).

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?

Roughly three sentences, front-loaded with the core action and with zero filler. The phrasing 'from its rows as you may see them' is slightly convoluted but is doing real work (permission scoping), so nothing is truly wasted.

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

Completeness4/5

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

There is no output schema, so the description carries the burden of describing returns, and it does so concretely: an image, the visible rows, a row count, plus a conditional diagnostics list for Vega-Lite. What is missing is any hint about size, pagination, or how many rows come back, which matters for an image-returning tool.

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

Parameters3/5

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

Schema coverage is 100%, and both parameters are already documented in the schema with their provenance (fastero_list_reports, fastero_get_dashboard, fastero_list_projects). The description adds no further semantics about reportId or projectId, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific action (render a saved chart as an image) plus concrete outputs: the picture, the rows, the row count, and a Vega-Lite lint report. That is far more specific than the title 'Show report'. It does not, however, distinguish itself from the close siblings fastero_get_report or fastero_show_chart, which an agent must otherwise infer.

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

Usage Guidelines4/5

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

It explicitly routes mutation intent away ('To change the chart, fastero_update_report') and states a when-not case ('A widget that is not a chart is refused'), which prevents a predictable failure. The remaining gap is that the read-side alternatives (fastero_get_report for metadata, fastero_show_chart) are never contrasted.

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

fastero_stop_streamlit_appStop Streamlit appAInspect

Stop a Streamlit app's server now; its files and settings are kept. The reply says 'stopping' at once, and it is stopped within a minute or two, which fastero_get_streamlit_app confirms. An idle app needs no stopping to save compute: it sleeps by itself after the idle timeout it was made with, its organisation's setting at the time, unless it is always on, which fastero_set_streamlit_always_on switches off. A stopped app starts again when fastero_run_streamlit_app starts it or a project member opens its link. To remove the app, fastero_delete_streamlit_app. Owners, admins and editors of the project can stop it; an app deleted or not in this project answers "Streamlit app not found."

NameRequiredDescriptionDefault
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say non-readOnly and non-destructive; the description adds the real behavior: the reply returns 'stopping' immediately but completion takes a minute or two, confirmed via fastero_get_streamlit_app, files and settings survive, and a deleted or out-of-project app returns 'Streamlit app not found.' It also discloses the permission model (owners, admins, editors).

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 core action and its non-destructive nature are front-loaded in the first sentence, and every subsequent sentence maps to a real decision (verify, don't bother for idle apps, restart path, delete path, permissions). It runs long, and the idle-timeout/organisation-setting clause could be tightened, but no sentence is pure filler.

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 two-parameter mutation with no output schema, the description covers timing, verification route, reversibility, error behavior, permissions and the sibling alternatives. Nothing an agent needs to decide whether and how to call it is missing.

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

Parameters3/5

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

Both parameters are fully documented in the schema at 100% coverage (appId from fastero_list_streamlit_apps, projectId from fastero_list_projects), so the baseline of 3 applies. The description adds only indirect meaning via the 'not in this project' error case and does not restate or enrich parameter formats.

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 ('Stop a Streamlit app's server') plus the crucial scope qualifier that files and settings are preserved. It also explicitly says what it is not: not a delete (that is fastero_delete_streamlit_app) and not something an idle app needs. An agent can separate it from every nearby sibling without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use and when-not-to-use guidance: idle apps need no stopping because they sleep on their own idle timeout, unless always-on, in which case fastero_set_streamlit_always_on is the lever. It names the alternatives for restart (fastero_run_streamlit_app / member opening the link), for removal (fastero_delete_streamlit_app) and for verification (fastero_get_streamlit_app).

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

fastero_unpublish_widget_apiTurn off widget APIA
DestructiveIdempotent
Inspect

Turn off a widget's private web address, published with fastero_publish_widget_api: its key stops working at once and is discarded. The widget, its query and the dashboards that show it are untouched, and the address is kept: publishing it again reuses it with a new key. A widget that is not published is left as it is. Returns widgetId, name and published: false. Owners, admins and editors of the project can turn it off; a widget not in this project answers "Widget not found".

NameRequiredDescriptionDefault
widgetIdYesA query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports).
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructive/idempotent, but the description adds real substance: the key is immediately invalidated and discarded, the widget/query/dashboards are untouched, the address is retained for republishing, no-op on unpublished widgets, and required roles (owner/admin/editor). It also discloses the not-found error text.

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

Conciseness5/5

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

Front-loaded with the action and its immediate consequence, followed by collateral effects, idempotency, return shape and permissions. Dense but every sentence adds information an agent would otherwise have to guess.

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?

No output schema exists, yet the description spells out the return shape (widgetId, name, published: false), the authorization requirement, and the error case, which is everything needed to invoke and interpret the call.

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

Parameters3/5

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

Schema coverage is 100% and both parameters are documented in the schema (including which list tools supply the ids), so the schema carries the load; the description adds no further parameter-level detail. Baseline 3 applies.

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 ('Turn off a widget's private web address') and explicitly ties it to the inverse sibling fastero_publish_widget_api, so it is distinguishable from any other mutation tool in the list.

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

Usage Guidelines4/5

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

Clear context: use it to sever the published API key, and the counterpart publish tool is named as the way back. It also says what happens for an already-unpublished widget, but it does not contrast against other options such as deleting the widget entirely.

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

fastero_update_dashboardUpdate dashboardA
DestructiveIdempotent
Inspect

Change a dashboard’s name, description, layout, filter bar or tabs; fields not sent stay as they are. layout, filters and tabs each replace the whole list, so send the full list with the change made: fastero_get_dashboard has the current ones. A chart left out of layout comes off this dashboard only, and the chart, its query and its place on other dashboards stay (fastero_delete_report deletes a chart everywhere). fastero_save_chart adds one chart from SQL without resending the layout. Returns the dashboard with its url.

NameRequiredDescriptionDefault
nameNoA new name.
tabsNoThe dashboard’s tabs, replacing the whole list; [] removes them and every chart is on one page again. Each entry is { id, name }: id a short string unique on the dashboard, which layout entries name as tabId; name at most 60 characters. Filters and the date grouping apply across every tab. At most 12.
layoutNoThe charts on the dashboard, replacing the whole list. Each entry is { reportId, i, x, y, w, h, tabId?, height? }: reportId a report of this project (fastero_list_reports); i a unique string for the entry, such as the reportId. Fastero shows any summary first, then number cards, charts and tables, each in the order of this list. The first line or time-series chart leads at full width, other charts pair up two across, and one with w over 6 takes the full width (a pie never does); x, y and h change nothing on screen, which follows the order of this list, but keep y then x in that order: the PDF attached to dashboard emails and the editor’s Reset sort by them. height 'tall' makes a chart, and the one beside it, half as tall again. tabId is the tab an entry is on when the dashboard has tabs; an entry naming none is on the first.
filtersNoThe dashboard’s filter bar, replacing the whole list; [] removes every filter. Each filter narrows every chart whose result has its column, and a dropdown lists the values in the data. Each entry is { column, type, label?, default? }: column spelled as the charts’ results name it; type one of dateRange, select, multiselect, number, text; a dateRange default is { start, end }, each YYYY-MM-DD. At most 20.
projectIdYesThe project’s id, from fastero_list_projects.
dashboardIdYesA dashboard’s id, from fastero_list_dashboards.
descriptionNoA new description.

TDQS

A4.6/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: layout/filters/tabs are whole-list replacements, a chart dropped from layout only leaves this dashboard (its query and other placements survive), and the return value is the dashboard with its url. This explains exactly what the destructiveHint=true annotation means in practice and where destruction does not occur.

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-loads the core action and the replace-vs-patch rule in the first sentence, then layers caveats and sibling routing. Dense but every sentence carries a distinct constraint; it is long, though the complexity of a 7-parameter nested mutation justifies most of it.

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?

With no output schema, the description still states the return value (dashboard plus url). It covers prerequisites (read current state via get_dashboard), destructive replacement scope, and the non-destructive chart-removal nuance, which is everything an agent needs to call this safely.

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 per-field syntax is already documented, but the description adds cross-parameter semantics the schema cannot: omitted fields are preserved while list-valued fields are replaced wholesale, and the full list must be resent. That is real added meaning beyond the field-level 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?

States a specific verb and resource plus the exact fields it touches (name, description, layout, filter bar, tabs) and the patch semantics ('fields not sent stay as they are'). It distinguishes itself from fastero_get_dashboard, fastero_delete_report and fastero_save_chart by naming them and their distinct jobs.

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

Usage Guidelines4/5

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

Gives clear routing: use fastero_get_dashboard to fetch current layout/filters/tabs before resending, use fastero_delete_report to remove a chart everywhere, use fastero_save_chart to add one from SQL without resending the layout. No explicit 'do not use this for X' exclusion, but the conditions that select each alternative are stated.

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

fastero_update_pageUpdate pageA
DestructiveIdempotent
Inspect

Change a hosted page in place: its HTML, name, widgets or noteEnabled. Fields left out stay as they are, and its address, refresh setting, recent errors and who opened it are kept. html replaces the whole document, so read it first with fastero_get_page, and write it by the rules fastero_create_page gives for a page; fastero_create_page publishes a new page instead, and fastero_set_page_refresh changes how it refreshes. HTML over 2 MB, or a widget of another project or of type integration, is refused with the reason. Returns the page without its HTML, with its url. Owners, admins and editors of the project can change it. fastero_show_page shows it in the conversation.

NameRequiredDescriptionDefault
htmlNoThe whole new HTML document, at most 2 MB, replacing the old one.
nameNoA new name, at most 200 characters.
pageIdYesA hosted page’s id, from fastero_list_pages.
widgetsNoThe widgets the page may read, each under the name its code asks for: widgets of this project of type query, file or notebook (fastero_list_reports lists them). One of type integration is refused; a text block, though of type file, is accepted and gives the page no rows.
projectIdYesThe project’s id, from fastero_list_projects.
noteEnabledNoFastero writes a short AI note about the page's numbers above it. false turns it off, for a page with text of its own.

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the annotations (which already declare destructive and idempotent), it discloses partial-update semantics ('fields left out stay as they are'), what is preserved (address, refresh setting, recent errors, opener), that html is a full replacement, size/type validation with refusal reasons, permission requirements (owners/admins/editors), and the return shape (page without HTML, with url). The only gap is it never explicitly frames the overwrite as irreversible destruction of the previous document.

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 action, then alternatives, constraints, return value and permissions in a logical order with no filler. It is a single dense paragraph, so the reading flow is slightly heavy, but every sentence carries information that is not repeated elsewhere.

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 mutation tool with no output schema, the description covers everything an agent needs: mutation semantics, preserved fields, validation limits and failure reasons, authorization, return payload, and the companion read/refresh/display tools. Nothing material is omitted.

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; the description still adds semantics the schema does not: html is a whole-document replacement with a 2 MB cap, otherwise-absent fields are left intact, and widgets of type integration or from other projects are refused while a file-type text block is accepted but yields no rows.

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

Purpose5/5

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

Opens with a specific verb and resource ('Change a hosted page in place') and enumerates the mutable surface (HTML, name, widgets, noteEnabled). It explicitly separates itself from fastero_create_page and fastero_set_page_refresh, so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use sequencing ('read it first with fastero_get_page'), points to the rule source for HTML ('the rules fastero_create_page gives'), and names two alternatives with the condition that selects each: create_page publishes a new page, set_page_refresh changes refresh. fastero_show_page is also routed for display.

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

fastero_update_queryUpdate saved queryA
DestructiveIdempotent
Inspect

Change a saved query’s name or SQL text; fields not sent stay as they are, and its connection cannot be changed here. New SQL must be read-only, as for fastero_create_query. Every report, dashboard chart and alert built on the query reads the new SQL from its next run, and a chart plotting a column the new SQL no longer returns stops drawing it. The old SQL is not kept. When the SQL changes, send definitionsUsed again so it is restamped at the current version.

NameRequiredDescriptionDefault
sqlNoThe new SQL text, replacing the old.
nameNoA new name.
queryIdYesA saved query’s id, from fastero_list_queries.
projectIdYesThe project’s id, from fastero_list_projects.
definitionsUsedNoNames of the shared definitions (metrics, datasets) the SQL was built from.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only flag readOnlyHint=false, destructiveHint=true and idempotentHint=true; the description goes well beyond them by disclosing the destructive cascade (every report, dashboard chart and alert reads the new SQL from its next run), that charts plotting dropped columns stop drawing, and that the old SQL is not retained. It also carries a required conditional behavior: resend definitionsUsed so it is restamped at the current version.

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?

Three sentences, all information-dense, with the mutation and its field scope front-loaded before the downstream side effects. Each sentence carries unique content, though the phrasing is slightly dense and the definitionsUsed rule arrives last rather than being surfaced as a hard requirement.

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 destructive, no-output-schema mutation tool, the description covers the field-level semantics, an immutable field, downstream side effects, dropped-column behavior, loss of the old SQL, and the version restamping requirement. Nothing an agent needs to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the per-parameter meanings are already documented and the baseline is 3. The description adds conditional semantics the schema cannot express: definitionsUsed must be resent specifically when SQL changes, and the sql parameter carries the read-only constraint rather than arbitrary SQL.

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 saved query's name or SQL text') and immediately scopes the operation by naming the two mutable fields and excluding connection changes. An agent can distinguish this from fastero_create_query, fastero_delete_query and fastero_get_query without opening any schema.

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

Usage Guidelines4/5

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

Explains the partial-update rule ('fields not sent stay as they are') and an explicit exclusion ('its connection cannot be changed here'), and cross-references fastero_create_query for the read-only SQL constraint. It does not spell out when to prefer create-vs-update or any prerequisite permissions, so it stops short of 5.

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

fastero_update_reportUpdate reportA
DestructiveIdempotent
Inspect

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.

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.

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.

fastero_update_secretReplace secret valueA
DestructiveIdempotent
Inspect

Replace the value of one existing text Secret, chosen by id from fastero_list_secrets (a file Secret is left unchanged). This is the only way to replace a value: fastero_create_secret refuses a name that exists. Anything that starts more than 10 seconds after the change reads the new value (Fastero’s servers keep Secrets for up to 10 seconds): a Python run, an open notebook’s next cell run, a Streamlit app’s next start. A run already in progress keeps the old value, as does a running Streamlit app until it restarts. The old value is not kept. Only organization owners and admins can replace Secrets; an id with no Secret in this organization answers "Secret not found". Returns message and secret: its _id, name and type and when it was updated, never its value, which no tool returns, though a run’s own code can print it. The value passes through the model and is kept in plain text in the client session transcript.

NameRequiredDescriptionDefault
valueYesThe new value. Write-only.
secretIdYesA Secret’s id, from fastero_list_secrets.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true), disclosing the 10-second propagation window, that in-progress runs and running Streamlit apps keep the old value, that the old value is not retained, the owner/admin permission requirement, the 'Secret not found' error, and plaintext exposure in the client transcript. Nothing contradicts the annotations; 'old value is not kept' aligns with destructiveHint=true.

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?

It is dense and long, but front-loaded with the core action and critically informative throughout; nearly every clause (propagation timing, permission, error, return shape) earns its place. Minor verbosity keeps it just shy of the top.

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?

With no output schema, the description fully specifies the return value (message plus secret _id/name/type/updated, never the value). Combined with permission, timing, and error behavior, an agent has everything needed to call it correctly.

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 baseline is 3, but the description adds real meaning beyond the schema: it warns the value passes through the model and is stored in plaintext in the session transcript, and clarifies secretId origin from fastero_list_secrets. This is meaningful added context over the schema's 'Write-only' note.

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 ('Replace the value of one existing text Secret') and scopes it precisely ('chosen by id from fastero_list_secrets', file Secrets unchanged). It also explicitly distinguishes from the sibling fastero_create_secret, so an agent can differentiate without opening the schema.

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 says this is 'the only way to replace a value' and explains that fastero_create_secret refuses an existing name, which is exactly the when/why versus alternative guidance. It also notes file Secrets are left unchanged, scoping applicability further.

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

fastero_upload_fileUpload project fileA
Destructive
Inspect

Put a file into a project's files, where teammates can open and download it and ask the in-app assistant to build a dashboard from it — for example a CSV from the user's machine, or a report you produced. Send the bytes base64-encoded, up to about 7 MB before encoding. Names cannot contain \ / : * ? " < > | and .exe files are refused. A file of the same name already at the top of the project has its contents replaced. Returns the file id, which fastero_read_file reads back, and pathInNotebook, the path a notebook in this project opens it by. A file id is not a connection: fastero_create_file_connection makes a CSV or Excel file queryable with fastero_run_sql.

NameRequiredDescriptionDefault
nameYesFile name with its extension, e.g. 'sales.csv'.
projectIdYesThe project’s id, from fastero_list_projects.
contentBase64YesThe file bytes, base64-encoded.

TDQS

A4.6/5.0
Behavior5/5

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

Despite annotations marking this as destructive, the description goes well beyond them: it discloses the same-name overwrite behavior, the ~7 MB pre-encoding size ceiling, filename character restrictions, and .exe rejection. This is exactly the mutation context an agent needs before calling.

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?

One dense paragraph, front-loaded with what the tool does and its user-visible effect. Every sentence carries information, though the return-value and connection clarifications at the end could be broken out for easier scanning.

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?

With no output schema, the description compensates by naming the returned fields (file id and pathInNotebook) and explaining how each is used downstream. Combined with limits and overwrite semantics, an agent has everything needed to invoke this correctly.

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, and the description adds real meaning on top: the size limit applies to contentBase64, and name must carry an extension and avoid reserved characters. It stops short of 5 only because the parameter details are interleaved in prose rather than mapped explicitly.

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 ('Put a file into a project's files') plus the resulting state ('teammates can open and download it'). It clearly contrasts with sibling operations like fastero_read_file, fastero_delete_file, and fastero_create_file_connection.

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

Usage Guidelines4/5

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

Gives concrete usage scenarios ('a CSV from the user's machine, or a report you produced') and explicitly routes to fastero_create_file_connection when a queryable connection rather than a plain file is needed. It doesn't state explicit when-not-to-use conditions, keeping it just short of a 5.

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

fastero_write_notebookReplace notebook cellsA
DestructiveIdempotent
Inspect

Replace a notebook’s cell contents. Pass the full cell list; this overwrites. A SQL cell is a code cell whose source is the query and whose metadata has custom_type 'sql', connId (a connection id from fastero_list_connections) and variableName: when the notebook runs, its rows become a pandas DataFrame of that name for the cells after it. Answers with the notebook's id, title, how many cells it now has and when it was saved.

NameRequiredDescriptionDefault
cellsYesFull replacement cell list
projectIdYesThe project’s id, from fastero_list_projects.
notebookIdYesA notebook’s id, from fastero_list_notebooks.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=true, yet the description still adds real behavioral content: it reinforces full-list overwrite semantics, documents the SQL cell construction contract (custom_type 'sql', connId, variableName and its DataFrame side effect), and describes the return values. Only minor gaps (e.g., error behavior) remain.

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-loads the core action and the overwrite warning. The SQL-cell sentence is long and dense but every clause earns its place by encoding non-obvious domain semantics; overall slightly heavy but not padded.

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

Completeness4/5

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

With no output schema, the description compensates by stating what the call returns (id, title, cell count, saved time). Combined with annotations and the fully covered schema, an agent has enough to invoke correctly; only edge-case/error semantics are absent.

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 projectId/notebookId are already sourced from sibling tools. The description nonetheless adds meaning beyond the schema by explaining the internal structure of each cell in the 'cells' array — the SQL cell metadata shape and the variableName DataFrame behavior — which the bare 'Full replacement cell list' schema does not convey.

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+resource ('Replace a notebook's cell contents') and immediately clarifies the scope of the operation ('Pass the full cell list; this overwrites'). It is clearly distinguishable from siblings like read_notebook (read counterpart) and create_notebook (creation, not replacement).

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

Usage Guidelines3/5

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

The 'Pass the full cell list; this overwrites' clause implies you must first read the notebook and supply every cell, which is useful implicit guidance, but no alternative tool is named and no explicit when/when-not is given. Usage is inferable rather than stated.

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

fastero_write_python_fileWrite Python fileA
DestructiveIdempotent
Inspect

Create or overwrite one text file in a Python project; the answer does not say which it was. Pass the file text; it is encoded for transport. Each run reads the latest version. In a local project every stored file goes into each run; in one linked to a repository only the entrypoint file and requirements.txt (or .in) written here reach a run, and nothing is committed to the repository. For a notebook’s cells, fastero_write_notebook; for a Streamlit app’s files, fastero_write_streamlit_file.

NameRequiredDescriptionDefault
pathYesPath inside the project, e.g. 'main.py' or 'src/report.py'; folders in it need no creating. A local project runs 'main.py' by default.
contentYesThe file text, which may be empty. Replaces the file at that path entirely.
projectIdYesThe project’s id, from fastero_list_projects.
pythonProjectIdYesA Python project’s id, from fastero_list_python_projects.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag readOnlyHint=false, destructiveHint=true, idempotentHint=true, but the description adds real value beyond them: it warns the response does not indicate whether the file was created or overwritten, notes the content is encoded for transport, and explains that each run reads the latest version and that only the entrypoint plus requirements files reach a run in a repository-linked project (with nothing committed). This environment-dependent behavior is exactly the kind of disclosure 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?

Purpose is front-loaded in the first clause, and each sentence carries information (overwrite ambiguity, encoding, run semantics, project-type routing, sibling alternatives). The phrasing is a little choppy and the mid-sentence clause about the answer is slightly awkward, but nothing is padding.

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

Completeness4/5

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

For a four-parameter destructive mutation with no output schema, the description covers the important agent-facing questions: overwrite semantics, no create/overwrite signal in the response, encoding, and environment-specific run/commit behavior. Remaining gaps (concurrency, permissions) are minor.

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

Parameters3/5

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

Schema description coverage is 100%, so all four parameters (path, content, projectId, pythonProjectId) are already documented, including that content replaces the file entirely. The description adds only marginal detail (transport encoding of the file text), so the baseline 3 is appropriate.

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 (create/overwrite) and resource (one text file in a Python project), and explicitly names the sibling tools it is not (fastero_write_notebook, fastero_write_streamlit_file). An agent can distinguish it from related write tools without opening a schema.

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

Usage Guidelines4/5

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

Explicitly routes to alternatives for notebooks and Streamlit apps, and gives the context that behavior differs between local projects and repository-linked projects. It does not, however, state when this tool should not be used (e.g. binary/non-text content, or its relationship to upload_file/replace_streamlit_files), so the guidance is strong but not exhaustive.

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

fastero_write_streamlit_fileWrite Streamlit app fileA
DestructiveIdempotent
Inspect

Create or replace one file of a Streamlit app, leaving its other files as they are; fastero_replace_streamlit_files replaces the whole set instead, deleting what it leaves out, and fastero_get_streamlit_app reads the current files. path is the folder inside the app ('.' for the top level) and name the file name; the top-level app.py is the file the platform runs. A running app picks up the change in about 5 seconds; a changed requirements.txt applies on the next start, which fastero_run_streamlit_app makes. This tool refuses a Python file that calls socket., subprocess., os.setuid, exec( or eval( (which includes df.eval and pd.eval), and a file whose name ends in .exe, .bat, .sh, .conf, .key, .sql, .php, .msi, .com or .dll. An app imported from Git keeps the edit across its starts until it's sent to its repository as a pull request, or discarded, from the app's workspace. Returns written, the app's new version and the file's path and name. Owners, admins and editors of the project can write files.

NameRequiredDescriptionDefault
nameYesThe file's name with its extension, such as 'app.py' or 'requirements.txt': no slashes, and not starting with a dot.
pathNoFolder inside the app; '.' (the default) is the top level.
appIdYesA Streamlit app’s id, from fastero_list_streamlit_apps.
contentYesThe whole file text, replacing any file of that path and name.
projectIdYesThe project’s id, from fastero_list_projects.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare non-read-only, idempotent, destructive. The description adds far more: ~5 second hot reload, requirements.txt applying only on next start via fastero_run_streamlit_app, an explicit list of refused Python calls and blocked file extensions, Git-imported apps persisting the edit until PR or discard, and the permission levels that can write. This is exactly the context 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 action and the sibling routing, then constraints, then return value and permissions — a sensible order. It is dense with semicolon-chained clauses that are hard to parse in one pass, but essentially no sentence is filler.

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?

No output schema exists, and the description compensates by stating the return payload (written, new app version, file path and name). Combined with validation rules, timing, permissions, and persistence behavior, an agent has everything needed to call it correctly and to predict failure modes.

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; the description nevertheless adds semantics the schema lacks — that path is a folder with '.' meaning top level, that name is the file name, and that top-level app.py is the file the platform actually runs. It also clarifies content replaces the whole file, though it does not detail the projectId/appId provenance beyond what the schema already says.

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

Purpose5/5

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

Opens with a specific verb and resource ('Create or replace one file of a Streamlit app') and immediately scopes it against siblings: fastero_replace_streamlit_files (whole set) and fastero_get_streamlit_app (read). An agent can distinguish it from every nearby tool without opening a schema.

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?

Names both alternatives and the condition that selects each: whole-set replacement belongs to fastero_replace_streamlit_files (which deletes omitted files), reads belong to fastero_get_streamlit_app. It also signals the requirements.txt case is better served by a restart path, effectively an exclusion.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedfastero_create_report1 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 } } } ] }"
    • Changedfastero_pin_notebook_cell1 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 } } } ] }"
    • Changedfastero_save_chart1 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 } } } ] }"
    • Changedfastero_show_chart1 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 } } } ] }"
    • Changedfastero_update_report1 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. 6 tool updates
    • Changedfastero_create_report2 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 / 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"
        +}
    • Changedfastero_pin_notebook_cell2 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 / 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"
        +}
    • Changedfastero_save_chart2 fields changed
      • 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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "connectionId",
        -  "sql",
        -  "title",
        -  "chartType",
        -  "assignments",
        -  "dashboard"
        -]New value: +[
        +  "projectId",
        +  "connectionId",
        +  "sql",
        +  "title",
        +  "dashboard"
        +]
    • Changedfastero_show_chart2 fields changed
      • 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"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "projectId",
        -  "connectionId",
        -  "sql",
        -  "title",
        -  "chartType",
        -  "assignments"
        -]New value: +[
        +  "projectId",
        +  "connectionId",
        +  "sql",
        +  "title"
        +]
    • Addedfastero_show_report
    • Changedfastero_update_report3 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. 1 tool update
    • Changedfastero_set_python_schedule2 fields changed
      • addedInput schema / properties / emails
        Added value: +{
        +  "description": "Who is emailed the pictures: up to 20 addresses, each belonging to a member of this organisation; an address outside it is refused. An empty list stops the emails.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / slackChannel
        Added value: +{
        +  "description": "A Slack channel to post the pictures to, by name or id, which Fastero must be in: type /invite @Fastero there first. Slack must be connected in Fastero. '' stops the posts.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedfastero_schedule_dashboard_email1 field changed
      • addedInput schema / properties / slackChannel
        Added value: +{
        +  "description": "A Slack channel to post the dashboard's charts as pictures to as well, by name ('#metrics') or id. Slack must be connected to the organisation and Fastero in the channel: if it is not, the call is refused and says so, and someone types /invite @Fastero in the channel. Left out, the schedule keeps the channel it has; an empty string stops posting to Slack.",
        +  "type": "string"
        +}
  5. 5 tool updates
    • Changedfastero_create_report4 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"
        +}
    • Changedfastero_pin_notebook_cell1 field 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)."
    • Changedfastero_save_chart3 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 / 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"
        +}
    • Changedfastero_show_chart3 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 / 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"
        +}
    • Changedfastero_update_report4 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"
        +}
  6. 5 tool updates
    • Changedfastero_create_page2 fields changed
      • changedInput schema / properties / widgets / description
        Previous value: -"The widgets the page may read, each under the name its code asks for: widgets of this project of type query or file (fastero_list_reports lists them). One of type notebook or integration is refused; a text block, though of type file, is accepted and gives the page no rows."New value: +"The widgets the page may read, each under the name its code asks for: widgets of this project of type query, file or notebook (fastero_list_reports lists them). One of type integration is refused; a text block, though of type file, is accepted and gives the page no rows."
      • changedInput schema / properties / widgets / items / properties / widgetId / description
        Previous value: -"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."New value: +"A query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports)."
    • Addedfastero_pin_notebook_cell
    • Changedfastero_publish_widget_api1 field changed
      • changedInput schema / properties / widgetId / description
        Previous value: -"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."New value: +"A query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports)."
    • Changedfastero_unpublish_widget_api1 field changed
      • changedInput schema / properties / widgetId / description
        Previous value: -"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."New value: +"A query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports)."
    • Changedfastero_update_page2 fields changed
      • changedInput schema / properties / widgets / description
        Previous value: -"The widgets the page may read, each under the name its code asks for: widgets of this project of type query or file (fastero_list_reports lists them). One of type notebook or integration is refused; a text block, though of type file, is accepted and gives the page no rows."New value: +"The widgets the page may read, each under the name its code asks for: widgets of this project of type query, file or notebook (fastero_list_reports lists them). One of type integration is refused; a text block, though of type file, is accepted and gives the page no rows."
      • changedInput schema / properties / widgets / items / properties / widgetId / description
        Previous value: -"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."New value: +"A query, spreadsheet or notebook-cell widget of the project (fastero_list_reports lists them, as reports)."
  7. 20 tool updates
    • Addedfastero_cancel_project_invite
    • Addedfastero_create_connection
    • Addedfastero_create_file_connection
    • Addedfastero_create_secret
    • Addedfastero_create_ssh_key
    • Addedfastero_invite_to_project
    • Addedfastero_list_secrets
    • Addedfastero_publish_widget_api
    • Addedfastero_revoke_dashboard_share
    • Addedfastero_run_notebook
    • Addedfastero_run_python_project
    • Addedfastero_run_streamlit_app
    • Addedfastero_schedule_dashboard_email
    • Addedfastero_schedule_notebook
    • Addedfastero_set_python_schedule
    • Addedfastero_set_streamlit_always_on
    • Addedfastero_share_dashboard
    • Addedfastero_stop_streamlit_app
    • Addedfastero_unpublish_widget_api
    • Addedfastero_update_secret
  8. 7 tool updates
    • Changedfastero_create_page2 fields changed
      • addedInput schema / properties / name / description
        Added value: +"The page’s name, as members see it; at most 200 characters."
      • changedInput schema / properties / widgets / description
        Previous value: -"The widgets the page may read, each under the name its code asks for. Each must be a spreadsheet or query widget of the same project (fastero_list_reports lists them)."New value: +"The widgets the page may read, each under the name its code asks for: widgets of this project of type query or file (fastero_list_reports lists them). One of type notebook or integration is refused; a text block, though of type file, is accepted and gives the page no rows."
    • Changedfastero_create_streamlit_app2 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional: what the app is for."
      • addedInput schema / properties / name / description
        Added value: +"The app’s name, as people will see it."
    • Changedfastero_list_connections1 field changed
      • changedInput schema / properties / orgId / description
        Previous value: -"The organization’s id; it defaults to this connection’s own, the only one it reaches."New value: +"The organization’s id; it defaults to the organization this key belongs to, the only one it reaches."
    • Changedfastero_list_triggers1 field changed
      • changedInput schema / properties / orgId / description
        Previous value: -"The organization’s id; it defaults to this connection’s own, the only one it reaches."New value: +"The organization’s id; it defaults to the organization this key belongs to, the only one it reaches."
    • Changedfastero_update_page3 fields changed
      • changedInput schema / properties / html / description
        Previous value: -"The whole HTML document, at most 2 MB."New value: +"The whole new HTML document, at most 2 MB, replacing the old one."
      • addedInput schema / properties / name / description
        Added value: +"A new name, at most 200 characters."
      • changedInput schema / properties / widgets / description
        Previous value: -"The widgets the page may read, each under the name its code asks for. Each must be a spreadsheet or query widget of the same project (fastero_list_reports lists them)."New value: +"The widgets the page may read, each under the name its code asks for: widgets of this project of type query or file (fastero_list_reports lists them). One of type notebook or integration is refused; a text block, though of type file, is accepted and gives the page no rows."
    • Changedfastero_update_report2 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."
    • Changedfastero_write_streamlit_file2 fields changed
      • addedInput schema / properties / content / description
        Added value: +"The whole file text, replacing any file of that path and name."
      • addedInput schema / properties / name / description
        Added value: +"The file's name with its extension, such as 'app.py' or 'requirements.txt': no slashes, and not starting with a dot."
  9. 2 tool updates
    • Changedfastero_get_dashboard_share_link2 fields changed
      • changedInput schema / properties / dashboardId / description
        Previous value: -"A dashboard’s id, from fastero_list_dashboards."New value: +"The dashboard whose public link this is: its id, from fastero_list_dashboards."
      • changedInput schema / properties / projectId / description
        Previous value: -"The project’s id, from fastero_list_projects."New value: +"The project the dashboard is in: its id, from fastero_list_projects."
    • Changedfastero_list_project_invites1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"The project’s id, from fastero_list_projects."New value: +"The project whose invites to list: its id, from fastero_list_projects."
  10. 8 tool updates
    • Changedfastero_create_query1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_delete_connection1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_get_connection1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_list_connection_schemas1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_run_sql1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_save_chart1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_save_definition1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
    • Changedfastero_show_chart1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"A data connection’s id, from fastero_list_connections."New value: +"A data connection’s id, from fastero_list_connections; fastero_create_file_connection makes one of an uploaded CSV or Excel file."
  11. 3 tool updates
    • Addedfastero_delete_streamlit_app
    • Addedfastero_set_dashboard_refresh
    • Addedfastero_set_page_refresh
  12. 68 tool updates
    • Changedfastero_create_alert2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / queryId / description
        Added value: +"A saved query’s id, from fastero_list_queries."
    • Changedfastero_create_dashboard3 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional: what the dashboard is for."
      • addedInput schema / properties / name / description
        Added value: +"The dashboard’s name, as people will see it."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_create_notebook3 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional: what the notebook is for."
      • addedInput schema / properties / name / description
        Added value: +"The notebook’s title."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_create_page2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / widgets / items / properties / widgetId / description
        Added value: +"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."
    • Changedfastero_create_python_project5 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional: what it does."
      • changedInput schema / properties / git / description
        Previous value: -"Required when sourceType is 'git': { repoUrl, branch, subDirectory }."New value: +"Required when sourceType is 'git': { repoUrl, branch, subDirectory }. branch defaults to main; subDirectory is a folder inside the repository holding the code."
      • addedInput schema / properties / name / description
        Added value: +"The Python project’s name, as people will see it."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • changedInput schema / properties / sourceType / description
        Previous value: -"'local' for a workspace you write files into (the default), or 'git' to clone a repository."New value: +"'local' for a workspace you write files into (the default), or 'git' to run code from a repository."
    • Changedfastero_create_query4 fields changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
      • addedInput schema / properties / name / description
        Added value: +"The query’s name, as people will see it."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • changedInput schema / properties / sql / description
        Previous value: -"The SQL text"New value: +"The SQL text, in the connection’s own dialect."
    • Changedfastero_create_report2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / queryId / description
        Added value: +"A saved query’s id, from fastero_list_queries."
    • Changedfastero_create_streamlit_app1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_delete_connection1 field changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
    • Changedfastero_delete_dashboard2 fields changed
      • addedInput schema / properties / dashboardId / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_delete_file2 fields changed
      • addedInput schema / properties / fileId / description
        Added value: +"An uploaded file’s id, from fastero_list_files."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_delete_notebook2 fields changed
      • addedInput schema / properties / notebookId / description
        Added value: +"A notebook’s id, from fastero_list_notebooks."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_delete_page2 fields changed
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_delete_python_project2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_delete_query2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / queryId / description
        Added value: +"A saved query’s id, from fastero_list_queries."
    • Changedfastero_delete_report2 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."
    • Changedfastero_disable_trigger1 field changed
      • addedInput schema / properties / triggerId / description
        Added value: +"A trigger’s id, from fastero_list_triggers."
    • Changedfastero_enable_trigger1 field changed
      • addedInput schema / properties / triggerId / description
        Added value: +"A trigger’s id, from fastero_list_triggers."
    • Changedfastero_ensure_python_entrypoint2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_get_connection1 field changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
    • Changedfastero_get_dashboard2 fields changed
      • addedInput schema / properties / dashboardId / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_get_dashboard_share_link2 fields changed
      • addedInput schema / properties / dashboardId / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_get_definitions1 field changed
      • changedInput schema / properties / connectionId / description
        Previous value: -"The connection the SQL will run on."New value: +"The connection the SQL will run on: a data connection’s id, from fastero_list_connections."
    • Changedfastero_get_notebook_run3 fields changed
      • addedInput schema / properties / notebookId / description
        Added value: +"A notebook’s id, from fastero_list_notebooks."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / runId / description
        Added value: +"A notebook run’s id, from fastero_run_notebook."
    • Changedfastero_get_page2 fields changed
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_get_page_data3 fields changed
      • addedInput schema / properties / name / description
        Added value: +"The widget's name as the page declares it (widgets in fastero_get_page)."
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_get_python_project2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_get_python_run_log3 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
      • changedInput schema / properties / runId / description
        Previous value: -"The run to read, as returned by fastero_list_python_runs."New value: +"A Python run’s id, from fastero_list_python_runs."
    • Changedfastero_get_query2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / queryId / description
        Added value: +"A saved query’s id, from fastero_list_queries."
    • Changedfastero_get_report2 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."
    • Changedfastero_get_streamlit_app2 fields changed
      • addedInput schema / properties / appId / description
        Added value: +"A Streamlit app’s id, from fastero_list_streamlit_apps."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_get_streamlit_app_logs2 fields changed
      • addedInput schema / properties / appId / description
        Added value: +"A Streamlit app’s id, from fastero_list_streamlit_apps."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_connection_schemas1 field changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
    • Changedfastero_list_connections1 field changed
      • changedInput schema / properties / orgId / description
        Previous value: -"Organization id. Defaults to the token’s own org."New value: +"The organization’s id; it defaults to this connection’s own, the only one it reaches."
    • Changedfastero_list_dashboards1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Addedfastero_list_files
    • Changedfastero_list_notebooks1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_pages1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_project_invites1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_python_files2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_list_python_projects1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_python_runs2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_list_queries1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_reports1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_schedules1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Only this project."New value: +"Only this project’s schedules: a project’s id, from fastero_list_projects."
    • Changedfastero_list_streamlit_apps1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_list_triggers1 field changed
      • changedInput schema / properties / orgId / description
        Previous value: -"Organization id. Defaults to the token’s own org."New value: +"The organization’s id; it defaults to this connection’s own, the only one it reaches."
    • Changedfastero_read_file2 fields changed
      • addedInput schema / properties / fileId / description
        Added value: +"An uploaded file’s id, from fastero_list_files."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_read_notebook2 fields changed
      • addedInput schema / properties / notebookId / description
        Added value: +"A notebook’s id, from fastero_list_notebooks."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_read_python_file2 fields changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_rename_file3 fields changed
      • addedInput schema / properties / fileId / description
        Added value: +"An uploaded file’s id, from fastero_list_files."
      • addedInput schema / properties / name / description
        Added value: +"The new name with its extension, e.g. 'sales-2026.csv'."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_replace_streamlit_files2 fields changed
      • addedInput schema / properties / appId / description
        Added value: +"A Streamlit app’s id, from fastero_list_streamlit_apps."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_report_page_error3 fields changed
      • addedInput schema / properties / message / description
        Added value: +"The error text the page's code threw."
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_run_sql1 field changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
    • Changedfastero_save_chart5 fields changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
      • addedInput schema / properties / dashboard / properties / id / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / dashboard / properties / name / description
        Added value: +"The dashboard’s name."
      • changedInput schema / properties / projectId / description
        Previous value: -"The project the chart is saved into if the person keeps it."New value: +"The project the chart is saved into if the person keeps it: a project’s id, from fastero_list_projects."
      • addedInput schema / properties / title / description
        Added value: +"The chart’s title, as people will see it."
    • Changedfastero_save_definition1 field changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
    • Changedfastero_set_job_callback4 fields changed
      • addedInput schema / properties / destinationName / description
        Added value: +"A destination’s name, from fastero_list_callback_destinations."
      • changedInput schema / properties / entrypointId / description
        Previous value: -"Python projects only."New value: +"Python projects only: one entrypoint’s id, from the entrypoints in fastero_get_python_project."
      • addedInput schema / properties / jobId / description
        Added value: +"The job’s id: a Python project’s, from fastero_list_python_projects, or a schedule’s, from fastero_list_schedules."
      • addedInput schema / properties / remove / description
        Added value: +"true detaches the destination from the job."
    • Changedfastero_set_schedule_enabled2 fields changed
      • addedInput schema / properties / enabled / description
        Added value: +"false switches it off, true back on."
      • addedInput schema / properties / scheduleId / description
        Added value: +"A schedule’s id, from fastero_list_schedules."
    • Changedfastero_show_chart5 fields changed
      • addedInput schema / properties / connectionId / description
        Added value: +"A data connection’s id, from fastero_list_connections."
      • addedInput schema / properties / dashboard / properties / id / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / dashboard / properties / name / description
        Added value: +"The dashboard’s name."
      • changedInput schema / properties / projectId / description
        Previous value: -"The project the chart is saved into if the person keeps it."New value: +"The project the chart is saved into if the person keeps it: a project’s id, from fastero_list_projects."
      • addedInput schema / properties / title / description
        Added value: +"The chart’s title, as people will see it."
    • Changedfastero_show_page2 fields changed
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_update_dashboard7 fields changed
      • addedInput schema / properties / dashboardId / description
        Added value: +"A dashboard’s id, from fastero_list_dashboards."
      • addedInput schema / properties / description / description
        Added value: +"A new description."
      • changedInput schema / properties / layout / description
        Previous value: -"Widget placements, replacing the whole layout. Each entry is { reportId, i, x, y, w, h, tabId? }: i a unique string for the entry, x/y the grid position, w/h the size in grid units, tabId the id of the tab it is on when the dashboard has tabs (an entry naming no tab is on the first)."New value: +"The charts on the dashboard, replacing the whole list. Each entry is { reportId, i, x, y, w, h, tabId?, height? }: reportId a report of this project (fastero_list_reports); i a unique string for the entry, such as the reportId. Fastero shows any summary first, then number cards, charts and tables, each in the order of this list. The first line or time-series chart leads at full width, other charts pair up two across, and one with w over 6 takes the full width (a pie never does); x, y and h change nothing on screen, which follows the order of this list, but keep y then x in that order: the PDF attached to dashboard emails and the editor’s Reset sort by them. height 'tall' makes a chart, and the one beside it, half as tall again. tabId is the tab an entry is on when the dashboard has tabs; an entry naming none is on the first."
      • addedInput schema / properties / layout / items
        Added value: +{
        +  "properties": {
        +    "h": {
        +      "type": "number"
        +    },
        +    "height": {
        +      "enum": [
        +        "tall"
        +      ],
        +      "type": "string"
        +    },
        +    "i": {
        +      "type": "string"
        +    },
        +    "reportId": {
        +      "description": "A report’s id, from fastero_list_reports, or from a dashboard’s items in fastero_get_dashboard.",
        +      "type": "string"
        +    },
        +    "tabId": {
        +      "description": "The id of one of the dashboard’s tabs (tabs, here or in fastero_get_dashboard).",
        +      "type": "string"
        +    },
        +    "w": {
        +      "type": "number"
        +    },
        +    "x": {
        +      "type": "number"
        +    },
        +    "y": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "reportId",
        +    "i",
        +    "x",
        +    "y",
        +    "w",
        +    "h"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / name / description
        Added value: +"A new name."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / tabs / items / properties / id / description
        Added value: +"A short id you choose, unique on the dashboard; layout entries name it as tabId."
    • Changedfastero_update_page3 fields changed
      • addedInput schema / properties / pageId / description
        Added value: +"A hosted page’s id, from fastero_list_pages."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / widgets / items / properties / widgetId / description
        Added value: +"A query or spreadsheet widget of the project (fastero_list_reports lists them, as reports)."
    • Changedfastero_update_query4 fields changed
      • addedInput schema / properties / name / description
        Added value: +"A new name."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / queryId / description
        Added value: +"A saved query’s id, from fastero_list_queries."
      • addedInput schema / properties / sql / description
        Added value: +"The new SQL text, replacing the old."
    • Changedfastero_update_report2 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."
    • Changedfastero_upload_file1 field changed
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_write_notebook2 fields changed
      • addedInput schema / properties / notebookId / description
        Added value: +"A notebook’s id, from fastero_list_notebooks."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
    • Changedfastero_write_python_file4 fields changed
      • changedInput schema / properties / content / description
        Previous value: -"The file text. Replaces the file at that path entirely."New value: +"The file text, which may be empty. Replaces the file at that path entirely."
      • changedInput schema / properties / path / description
        Previous value: -"Path inside the project, e.g. 'main.py' or 'src/report.py'. A local project runs 'main.py' by default."New value: +"Path inside the project, e.g. 'main.py' or 'src/report.py'; folders in it need no creating. A local project runs 'main.py' by default."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
      • addedInput schema / properties / pythonProjectId / description
        Added value: +"A Python project’s id, from fastero_list_python_projects."
    • Changedfastero_write_streamlit_file2 fields changed
      • addedInput schema / properties / appId / description
        Added value: +"A Streamlit app’s id, from fastero_list_streamlit_apps."
      • addedInput schema / properties / projectId / description
        Added value: +"The project’s id, from fastero_list_projects."
  13. 1 tool update
    • Removedfastero_set_python_schedule

Publisher details

Operator
Fastero
Operator website
https://fastero.com
Vendor relationship
First-party
Trust center
Not applicable
Restrictions
Needs a Fastero account. There is a free plan, and new accounts get 14 days of Pro. A few features, such as keeping a Streamlit app always on, need a paid plan. No admin approval, regional limit or custom OAuth app: sign in with OAuth, or use an API key.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Query SQL databases (SQLite, PostgreSQL, BigQuery, Databricks) in natural language through a business semantic layer — glossary, metrics, and a data dictionary grounded against your real schema. Read-only by default, with an embedded SQLite + sqlite-vec metadata store and no external infra required.
    25
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query DuckDB, Postgres, and BigQuery through a governed, read-only layer with a semantic model, SQL guard, role-based row policies, PII pseudonymization, audit logging, and cost caps.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides secure read-only SQL access to PostgreSQL and ClickHouse databases with built-in safety features like read-only enforcement, timeouts, and managed result files.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.