singlestore-mcp-server
A local MCP server for SingleStore that supports SQL, pipeline management, and interactive data apps from Claude, VS Code, or a standalone workspace.
Run SQL and inspect schemas with
run_sql,list_databases,list_tables, anddescribe_table.Manage SingleStore Pipelines: create, alter, start, stop, test, drop, list, get status, and get DDL.
Open interactive apps: Schema Explorer, Pipeline Monitor, Query Grid, SQL Editor, Notebook, Cluster Monitor, Query History, and Alerts.
Explore schemas visually: databases, tables/views, storage type, row counts, sizes, columns, keys, DDL, and previews.
Monitor pipelines: state, source, batches, lag, errors; start/stop/test from the UI.
Run read-only queries into a sortable/filterable grid with CSV export, or use the SQL Editor for autocomplete, charts, history, and file open/save.
Use the Notebook for SQL/Python/SAS/text cells on a Jupyter kernel, pandas DataFrames, charts,
%sqlmagics, and.ipynbfiles.Chat with Claude inside the SQL Editor and Notebook for read-only DB checks and insertable SQL/Python.
Save and switch among several SingleStore connections, with password/JWT/Helios SSO/Microsoft Entra ID auth.
Use slash commands/skills like
/singlestore-workspace,/singlestore-notebook,/singlestore-explain-query,/singlestore-pipeline-health, and/singlestore-restart.Run the workspace standalone without Claude via a desktop shortcut or browser, and connect to Helios or self-managed clusters.
Provides tools for interacting with SingleStore, including running SQL statements, listing databases and tables, describing table schemas, and managing SingleStore Pipelines for continuously loading data from sources like S3, Kafka, Azure, GCS, and filesystems.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@singlestore-mcp-serverList all databases and show the schema of the users table."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
singlestore-mcp-server
A local MCP server for SingleStore that runs in stdio mode from Claude Code, Claude Desktop or VS Code, and works with SingleStore Helios and self-managed clusters alike.
For how it's built and how it connects to SingleStore, Claude, SAS Viya and identity providers, see docs/ARCHITECTURE.md.
What it does
SQL and schema tools: run SQL, list databases and tables, describe tables, so Claude can query and explain your data.
Pipelines as first-class tools: create, alter, start, stop, test, drop and inspect SingleStore Pipelines (S3, Kafka, Azure, GCS, filesystem).
Interactive apps in Claude (MCP Apps), combined in one SingleStore Workspace with a left-hand rail:
SQL Editor: autocomplete for SingleStore SQL, functions and your schema; results grid; Open/Save
.sqlfiles; procedure-aware statements.Notebook: SQL, Python and text cells on a Jupyter kernel; SQL results become pandas DataFrames; charts;
%sql/%%sqlmagics;.ipynbfiles compatible with SingleStore Notebooks; several notebooks as tabs.Schema Explorer, Pipeline Monitor, Cluster Monitor (CPU, memory, disk per node, running queries, cluster health, 7-day metrics history and backups) and a Query Grid.
Claude inside the apps: a chat panel in the SQL Editor and the Notebook that checks the database (read-only) and answers with SQL / Python you can insert with one click.
Slash commands:
/singlestore-workspace,/singlestore-notebook,/singlestore-table-report,/singlestore-pipeline-health, … and/singlestore-restartto reload the server without reconnecting.Several SingleStore connections: save connections (passwords in the OS credential store) and switch the active one from the workspace or by asking Claude.
Standalone workspace: the same apps in their own window from a desktop shortcut, with no Claude subscription needed (only the Claude chat needs Claude); see Using the workspace without Claude.
Related MCP server: mysql-mcp-server
How it's built
It's built on official SDKs rather than reimplementing protocol or driver code:
mcp— the official Model Context Protocol Python SDK. It handles the stdio transport, JSON-RPC framing, tool-schema generation (MCPServer) and the MCP Apps extension.singlestoredb— SingleStore's own official Python client. It handles the actual database connection.@modelcontextprotocol/ext-apps— the official MCP Apps browser client, vendored and inlined into the interactive UIs (see SingleStore Workspace).
Everything in src/singlestore_mcp is glue: a
pooled connection wrapper (db.py) and a set of MCP
tools (server_impl.py), including first-class
tools for Pipelines (SingleStore's mechanism for continuously loading
data from S3/Kafka/Azure/GCS/filesystem sources), which the official
mcp-server-singlestore package does not expose as dedicated tools.
Because it connects over the plain MySQL wire protocol via host/port/user/ password, it works identically against SingleStore Helios (cloud) and self-managed SingleStore clusters — there's no dependency on the Management API or browser OAuth.
Tools
General:
run_sql— run any SQL statementlist_databases,list_tables,describe_table
Pipelines:
list_pipelines,pipeline_status,get_pipeline_ddlcreate_pipeline,alter_pipeline(take a full statement — pipeline syntax varies too much by source/format to model as parameters)start_pipeline(background orFOREGROUND, with optional batch limit)stop_pipeline,drop_pipeline,test_pipeline
Interactive apps (see SingleStore Workspace): sql_editor (opens the
SingleStore Workspace), notebook, pipeline_monitor, query_grid,
schema_explorer, cluster_monitor.
Other:
browser_link: a link that opens an app full-window in your browsersql_editor_reply: send SQL or an answer into an open SQL Editor's chatrestart_server: reload the server's code and apps without reconnectinglist_connections,use_connection: see the saved SingleStore connections and switch the active one
Slash commands
Command | What it does |
| Open the SingleStore Workspace, e.g. |
| Open a notebook |
| Explain a query, run |
| Build a pipeline from an S3 path / Kafka topic (asks before creating) |
| Check all pipelines for errors, stalls and lag |
| Size, storage, keys and data profile of a table |
| Restart the server so code and app changes load |
These are Claude Code skills, in claude-skills/: copy
the folders to ~/.claude/skills/ to use them.
The server also offers the same commands as MCP prompts
(/singlestore:workspace, /singlestore:restart, …). The Claude Code
desktop app adds an "(MCP)" label to those that it then refuses to send, so
use the skills there; other clients can use the prompts.
Restarting without reconnecting
The process Claude starts is a small relay (supervisor.py)
that runs the real server as a child process. The restart_server tool (or
/singlestore:restart) replaces that child, replays the MCP handshake and
tells Claude that the tools, prompts and resources changed, so Python and app
changes load in a few seconds without touching /mcp. Browser links and open
browser tabs keep working across a restart (see Browser and desktop window).
Set SINGLESTORE_MCP_NO_SUPERVISOR=1 to run the server without the relay.
Restarts are fast because most of a fresh server's start is loading the MCP
SDK and the database driver, which don't change when this project's code does.
5 s after each start the relay prepares a standby process that has loaded only
those packages; restart_server hands over to it, and it then loads this
project's code fresh from disk while the old server stops. The standby has
also opened the server's database connections already (4, to the active saved
connection; password logins only), checks them with a ping every minute and
hands them over, so the first answer doesn't wait ~1–1.5 s for a connection:
restart_server → Workspace usable in ~0.85 s (was ~1.9 s; ~6 s without a
standby). It keeps them at most an hour (then the server connects at start, as
before); SINGLESTORE_MCP_STANDBY_CONNECT=0 turns this off. The standby is an
idle Python process (~25–90 MB); if packages were installed or removed since it
loaded them, it steps aside and a fresh server starts.
SINGLESTORE_MCP_NO_STANDBY=1 turns it off. Any server start also opens its
database connections while the code loads, so the first tool call doesn't wait
for them. On Windows the relay starts the servers with the base Python directly
(as multiprocessing does), not through the virtual environment's launcher, so
each Claude session runs four Python processes instead of six.
If the server exits on its own — typically a syntax or import error in code
you just changed — the relay starts it again after a back-off (1, 2, 5, 10,
20, then every 30 s; the count starts over once a server has run for a
minute) instead of in a tight loop. It logs the error (the end of the
traceback) to the MCP server log, and answers tool calls at once with that
error instead of letting them wait. Fix the code and call restart_server
(the relay answers it itself, so it works while the server is down): it starts
the server right away, or reports the new error.
SingleStore Workspace
In hosts that support MCP Apps (e.g. Claude), the server's apps open as interactive windows in the chat. In other hosts the same tools return a normal text result.
The apps are combined in the SingleStore Workspace, shown to customers as SAS SpeedyStore Studio (the name and mark at the top of the rail, the browser tab's title). A slim rail on the left switches between its views:
View | What it's for |
SQL | SQL Editor: write and run SQL, with autocomplete and Claude |
Notebook | Notebook: SQL and Python cells on a Jupyter kernel |
Schema | Schema Explorer: databases, tables, columns, keys |
Pipelines | Pipeline Monitor: state, progress and errors of pipelines |
Cluster | Cluster Monitor: CPU, memory, disk per node, running queries, health, metrics history, backups |
Connect (bottom of the rail) | Connections: saved SingleStore connections and the active one |
Opening it
Ask Claude ("open the SingleStore workspace"), or use
/singlestore-workspace(optionally with a database and view, e.g./singlestore-workspace SASDP notebook).The tool behind it is
sql_editor(database?, sql?, view?, table?, new_tab?);viewissql,notebook,schema,pipelines,cluster,history,security,config,alerts,workloadorconnections.sqlgoes into the SQL Editor's active tab, or a new tab withnew_tab=true.Outside Claude: in your browser or as a desktop app, see Browser and desktop window.
Working with it
Each view loads the first time you open it and keeps its state when you switch; hidden views pause their auto-refresh.
Views hand work to each other, e.g. Query in grid in the Schema view opens the table's query in the SQL view and runs it.
The database dropdowns refresh themselves (when opened, after
CREATE/DROP DATABASE, and with ↻).⤢ Full screen (where the host supports it) and ↗ Open in browser sit at the bottom of the rail.
Buttons that run tools go through Claude, which may ask you to approve them; statements that change data also ask in the app first.
Where code runs. Every place that runs SQL or code says where, in words and colour (a chip with an icon; on narrow windows just "S2" / "Compute" / "CAS" with the full text as tooltip):
Before: the Run button says the target, e.g. ▶ Run on SingleStore · prod, ▶ Run in SAS Compute · Zeus, ▶ Run in CAS · Zeus (SingleStore: the active connection; SAS: the tab's SAS Viya connection). Run as has a visible label. The Workload's Run button says the same.
While it runs: "Running on SingleStore…", "Running in SAS Compute…", "Running in CAS…".
After: the result's status line, the SQL Editor's run history and the Notebook cell's status start with a chip SingleStore · prod / SAS Compute · Zeus / CAS · Zeus. PROC SQL / FedSQL / CAS on a SingleStore library add the pushdown outcome next to it: "→ pushed down to SingleStore: full / partial / none".
Notebook: each cell's header shows its engine: SingleStore (SQL), SAS Compute (SAS), Python (local).
Query History: every row ran on SingleStore; rows from SAS keep their Source (SAS EP / SAS CAS / SAS in-database) and say "ran on SingleStore, sent by CAS / SAS Compute / SAS (embedded process)".
Colours (shared.css, ≥ 4.5:1 in light and dark, checked by tests/test_contrast.py): SingleStore blue, SAS Compute
orange, CAS indigo, Python slate; the Run as languages use the same ones (PROC SQL / FedSQL orange, plain SAS teal).
Presenter mode. Present at the bottom of the rail (or &present=1 / &present=0 on a browser link) switches
it for every view; the browser remembers it. Text is ~20 % larger, and identifying metadata is replaced with neutral
labels, the same label for the same value in every view while the server runs: connection names → "Connection A",
hosts and IP addresses → "host-1", user names and e-mail addresses → "user1", SAS Viya addresses → "viya-1". The
labels come from the server (presenter_labels): saved SingleStore and SAS Viya connections, this computer's user and
host name, the cluster's user list, plus e-mails / IPs / host names a page finds. Only what's on screen changes (text,
tooltips, labels; form fields holding such a value are blurred until focused); what the views send stays real. Not
masked: the SQL / code editors and query results (a result cell is replaced only when it is exactly one of the known
values). Claude's context still has the real names (it's told presenter mode is on).
The Studio's own queries. The Workspace's housekeeping (the monitors, alert checks, schema and session reads) is
hidden from Cluster → Queries and Query History unless Show Studio's own queries is ticked (remembered per
browser). They are the statements marked /* s2-… */, and — because the plan cache drops comments — system-view reads
and session checks (SELECT 1, NOW(), @@variables, SHOW), which other tools send too.
SQL Editor
Writing and running SQL
Schema tree on the left; editor on top, results grid below (drag the divider to resize).
Autocomplete for SQL and SingleStore keywords, built-in functions (with signatures), your functions and procedures, databases, tables and columns.
Ctrl+Enter runs the statement at the cursor, or the selection. Reads run right away; statements that change data or schema ask first.
Understands
CREATE PROCEDURE / FUNCTION … BEGIN … ENDbodies,DECLAREsections andDELIMITER //scripts as one statement.▶▶ Run all (Ctrl+Shift+Enter) runs every statement in the editor in order, split the same way as Ctrl+Enter. Statements that change data are listed and confirmed once for the whole run. Each statement gets a tab with its status, rows and time; the last result set is shown. Run all stops at the first error unless Continue on error is ticked.
USE dbswitches the editor's database.Big results stream. A SingleStore read shows its first 1,000 rows as soon as they arrive (a
LIMIT 100000no longer waits for all 100,000); the rest keeps loading on the server while the status line shows1,000+ rows · loading…, and the total when it's done. Scrolling to the end of the grid loads the next 5,000 rows. Stop (while running or loading) cancels the query on the cluster (KILL QUERYon its own connection, after checking onPROCESSLISTthat it still runs this statement); the rows so far stay. The editor keeps at most 100,000 rows (about 128 MB) of one result (SINGLESTORE_MCP_EDITOR_MAX_ROWS); a bigger one is marked cut off at … and the statement is ended. Confirmed writes stream the same way (a statement that returns rows pages like a SELECT; a DML shows its affected rows): they're sent once, never retried after a dropped connection, and run without the session row limit. SAS results page too (see SAS below).Results export to CSV: Export CSV first loads every row of the result (up to that limit) and writes all of them; sorting a column also loads the rest first, so it sorts the whole result. The chart uses the rows loaded.
Chart (next to Table above the results) charts any result: bar (grouped or stacked), line, area, scatter or pie. It picks X and Y for you (a date or text column on X, the numeric columns on Y); you can change them, combine repeated X values (sum, average, count, min, max), split one measure into series by a column, sort, hide series in the legend and download the chart as SVG. Style picks the look: SingleStore, SAS, Classic, Colorblind-safe, Pastel, Ocean or Dark (remembered for all charts). Re-running the same query keeps the chart. Drawn as plain SVG, so it works without internet access.
Files
Open, Save (Ctrl+S) and Save as open a file browser: folders, plus shortcuts to the SQL folder, Documents, Desktop, Downloads and Home.
Files can live anywhere under your user folder; the SQL folder (
Documents\SingleStore SQLby default) is where the browser starts.The header shows the file name and ● for unsaved changes; replacing a file asks first.
Browse computer… uses the browser's own file picker; Download saves through the browser (works in the browser window; Claude may block it).
Recent (next to Open) and the top of the Open panel list the last 10
.sqlfiles you opened or saved; one click opens one. Files that no longer exist are left out.
Files on SAS Viya
The Open / Save as panel has three locations at the top: This computer (the above), SAS Content and SAS Server. Both Viya locations use the active SAS Viya connection (Connections → SAS Viya, or the Viya picker in a SAS tab).
SAS Content – the Folders and Files services, as in SAS Studio's Content tree: starts in My Folder, shortcuts Public and All folders (the root folders you can see).
SAS Server – the SAS Compute server's file system, as in SAS Studio's SAS Server tree, through the Workspace's own SAS session (the Compute API's file endpoints, so nothing runs as SAS code): starts in the compute context's lockdown path (e.g. a landing zone), shortcuts Home and Root (/). The first use starts the SAS session (~30 s).
Folders,
.sql/.sasfiles with size and modified time; All files shows every file; New folder (Save as) creates one; Connections… goes to the sign-in.A file opened from Viya opens in a tab like a local one (
.sas→ PROC SQL,.sql→ SingleStore SQL) and the tab remembers where it came from (connection, location and path), also after a restart; Save writes it back there and Recent lists it (name (SAS Content)).Save sends the version you opened (the file's ETag): if someone saved a newer version on Viya meanwhile (e.g. in SAS Studio), nothing is overwritten – the editor asks: Overwrite / Save as… / Cancel. Save as onto an existing file asks Replace it. A SAS Content file keeps its media type (a SAS Studio program stays a SAS program); a new
.sasfile is saved as one.The Notebook's Open / Save as has the same three locations: a notebook on SAS Content or the SAS server is a
.ipynbfile (SAS Content stores it asapplication/x-ipynb+json, up to 20 MB with outputs), with the same version check on Save. The Security view's Save as .sql… opens the same file browser, so a DBA script can go straight to SAS Content.
Rename and delete in the file browser
Hover a file or folder in Open / Save as (This computer, SAS Content, SAS Server; SQL Editor, Notebook, Security) for Rename and Delete:
One item at a time, in the folder shown: a rename keeps it in its folder (a file without an extension in the new name keeps its own). Delete asks first; a folder is only deleted when it's empty and after you type its name.
On this computer only the files the browser lists (
.sql/.sas, or.ipynb) and folders are touched, and a delete is permanent (no Recycle Bin). The browser's roots and shortcut folders (user folder, SQL folder, Documents, Desktop, Downloads,SINGLESTORE_MCP_FILE_ROOTS), My Folder, top-level SAS Content folders, the SAS server's home and lockdown folders – and the folders above them – are never renamed or deleted.Version checks: the item's ETag is sent as
If-Match(SAS Content and SAS Server), and a file whose modified time changed since the list was read is left alone (changed since the list was read – Refresh).SQL Editor tabs that have the file (or a file in the renamed folder) open follow it to the new path, also tabs not loaded right now and Recent; a renamed SAS Content file's new version is handed to the tab, so Save keeps working. A deleted file's tab keeps its text as unsaved (● untitled). The Notebook does the same for its file. Backend:
files_rename/files_deleteandviya_files_rename/viya_files_delete(app-only).If the active SAS Viya connection changes, a tab with a file from another connection shows ⚠ on Viya <name>, and Save asks whether to save it to the same path on the active connection instead.
Errors say what to do: not signed in → sign in under Connections; no permission; folder or file not found; changed on the server.
Restored tabs don't re-read their Viya file (that could start a SAS session for every tab); Save's version check catches a newer version.
Tabs
In the Workspace the editor has tabs, like the notebooks: + (or New, or Ctrl+Alt+N) opens one; each tab has its own text, database, open file, cursor, results, Continue on error and Claude chat.
A tab is labelled with its file name or untitled N, with ● while it has unsaved changes. Double-click a tab to give it your own title; drag it to move it. × closes it; a tab with unsaved changes asks first (click Discard ×). Closing the last tab leaves one empty tab.
Ctrl+Tab / Ctrl+Shift+Tab switch to the next / previous tab where the browser lets the page have those keys; Ctrl+Alt+PageDown / PageUp do the same. (Ctrl+T and Ctrl+W belong to the browser.)
Open and Recent open a file in a new tab when the current one has text, and switch to the tab that already has the file open. Save and Save as apply to the current tab.
SQL from Claude or other views goes into the active tab.
Autosave and history
Each tab saves its text, database, cursor and open file a second after you stop typing. The tabs come back in the same order, with the same active tab, when the SQL Editor opens again, also after a restart or in the browser window. Drafts are kept in
~/.singlestore-mcp/sql-editor/(tabs.jsonplusdrafts/<tab>.json), never in your.sqlfile: an open file shows ● modified until you Save. If the file changed on disk meanwhile, the editor says so and keeps your changes. (The singledraft.jsonfrom before tabs becomes the first tab once and is left in place as a backup.)SQL from Claude or other views (Query in grid, Top 100) is added below the active tab's text and selected, never replacing it.
History lists the last 500 statements you ran in the editor (all tabs), with time, database, the tab or file it ran from, duration, rows and ok/error, also after a restart. Filter it, Insert a statement at the cursor or Run it again in its database; Clear… empties it.
→ Workload
→ Workload in the toolbar sends the selection, else the statement at the cursor (or, by choice, every statement in the tab) to a test workload: pick an existing workload or New workload… (give it a name) and the runs per minute (default 60). The tab's database goes with it. A
-- name: …or-- per_minute: Nline right above a statement names it or sets its rate.In the Workspace the Workload view opens with the statements added but not saved, so you review them and Save; outside the Workspace the Workload app opens in your browser with them. Claude's answers in the chat panel have a → Workload button on each SQL block too.
A tab opened from the Workload view (Open in SQL Editor) has an Update in workload button; see Workload.
Building SELECTs
In the schema tree, SELECT columns on a table inserts a SELECT listing every column.
Expand a table to tick columns (Shift+click for a range, All / None) and click Insert SELECT for just those, in table order.
With the cursor on the
*ofSELECT *(ort.*), Ctrl+Space → Expand * replaces it with the column list, qualified by alias when the query joins several tables.Nothing runs automatically.
Chat with Claude
The Claude button opens a chat panel on the right.
Claude sees the editor's SQL and last result, checks the database (read-only), and answers with SQL that you Replace, Insert or Copy into the editor with one click. If the editor is empty, the answer's SQL goes straight in.
Answer here in the editor (default) uses the in-app assistant; in the Claude chat sends the question to the chat box instead (you click Send there).
SAS: Run as PROC SQL, FedSQL or FedSQL in CAS
The editor also runs SQL in SAS on your SAS Viya (the active SAS Viya connection in Connections, or the one the tab is pinned to), so the same SQL can be tried SingleStore-native and through SAS side by side.
Run as (next to the database picker) picks what the tab's SQL runs as: SingleStore SQL, PROC SQL or FedSQL (SAS libraries, in the Workspace's SAS Compute session) or FedSQL in CAS (caslibs). The picker next to it then lists databases, SAS libraries or caslibs; Ctrl+Shift+L cycles the languages. Each tab keeps its language (with its library and options) in its draft;
.sasfiles open as PROC SQL,.sqlfiles as SingleStore SQL. The language is never guessed from the SQL.You write only the SQL: the editor wraps it (
proc sql; … quit;,proc fedsql; … quit;, CASfedSql.execDirect). A SELECT becomesCREATE TABLE WORK._S2R_<tab> AS …(each tab has its own result table; CASUSER for CAS), whose rows fill the result grid with their SAS formats applied (dates as dates). The first 1,000 rows come with the result; the rest load as you scroll (Compute data API paging / CAStable.fetchfrom–to), with the total in the status line; sorting and Export CSV load them all. PROC SQL keeps up to 100,000 rows in the result table (OUTOBS; a bigger result is marked cut off). A result can be paged until the tab runs something else. Statement splitting, Ctrl+Enter and Run all work as for SingleStore SQL (SAS rules: no#comments or backticks).Text that starts with
proc,data,%,libname,options… runs as plain SAS code, unwrapped: the statement at the cursor takes the whole step through itsrun;/quit;. Its printed output shows in the result pane.Every Compute run starts with
options obs=max replace nosyntaxcheck; %let syscc=0;: a failed step (a DATA step reading a table that doesn't exist, say) put the session in SAS's syntax check mode (OBS=0) with&SYSCCset, and every later run in it then ended SAS reported an error without output until the session was restarted.PROC SQL: the library you pick is used for one-level names (
options user=); without one they're WORK tables, as in SAS. FedSQL one-level names are WORK tables; in CAS they're in the picked caslib (default CASUSER).⚙ (SAS options, per tab): PROC SQL OUTOBS (default: 100,000 rows kept for paging), NOEXEC and FEEDBACK, Show pushdown (on by default), the tab's SAS Viya connection and Restart SAS session.
Long runs and Stop. A SAS run goes to the background on the server; the status line shows Running in SAS… 1 min 12 s and Stop. Stop cancels the job (Compute: the documented
PUT …/jobs/{id}/state?value=canceledwith the job's ETag, or the session's running code if Viya refuses that; CAS:DELETE …/cas/sessions/{id}/actions, CAS's cancelAction): the run ends stopped with the SAS log up to there, and the SAS session keeps running (libraries, WORK and the startup code stay). If SAS doesn't stop the run (or it still runs 30 s after Stop), the status line offers Restart SAS session, which ends that connection's SAS sessions. A single job may run 4 hours (SINGLESTORE_MCP_SAS_TIMEOUT_MIN, minutes;0= no limit; it was 15 minutes).Several tabs. Each SAS Viya connection has one Compute and one CAS session, shared by the tabs that use it, running one job at a time. A run that has to wait says so: Waiting for the SAS run in tab “Report A” (running 2 min)…; it can be stopped while it waits (nothing reaches SAS). Runs on another connection (or in CAS while Compute is busy) don't wait.
SAS session started in the background. A cold SAS session (Compute session, automatic SingleStore library, startup code) takes ~15–50 s (on Zeus mostly Viya starting the Compute server: ~35–42 s for
POST …/sessions, then ~6–8 s for the first job). So when the Workspace opens, it starts the active SAS Viya connection's sessions in the background (sas_prewarm, as soon as Claude or the browser link opens the Workspace – thesql_editorcall itself – and again from the page ~1.5 s after its first paint; Compute first, then CAS), and again when another connection becomes the active one, when the active one is saved or signed in to. The header of the SQL Editor's SAS tabs and of the Schema Explorer's SAS sources shows SAS session: starting… / ready / not signed in / SAS Viya unreachable. A run or library list that comes while it starts waits for that same session (Waiting for the SAS session to start…) instead of starting a second one. Nothing is asked: a connection that isn't signed in, or a Viya that can't be reached (VPN off), is skipped and the reason shown. While the Workspace is open it asks every 4 minutes; the server then reads the session's state (GET /compute/sessions/{id}/state, no SAS code; this resets Viya's idle timeout,sessionInactiveTimeout, 15 minutes on Zeus) and the CAS session, and starts a new one if Viya ended it anyway. Close the Workspace and the checks stop, so Viya ends the session after its idle timeout. Tabs pinned to another SAS Viya connection aren't warmed (they show its state); the SAS 9 sign-on still waits until the SAS 9 source is opened. Off per connection (Connections → SAS Viya → Edit → Start the SAS session when the Workspace opens) or for the server withSINGLESTORE_MCP_SAS_PREWARM=0.Per-tab SAS Viya connection. A tab can be pinned to a saved SAS Viya connection (⚙, or the Viya: picker in the header when there are several): its runs, tree and autocomplete then use that connection's own sessions; Viya: active (…) follows the active connection. The pin is saved with the tab; switching the active connection elsewhere doesn't touch a pinned tab.
The result pane has Result, Log (the generated SAS code with Copy code, then the SAS log with errors, warnings and notes in colour) and Pushdown tabs. Colour badges show the language everywhere: S2 blue, PROC SQL / FedSQL orange, CAS indigo, SAS (plain code) teal, also in the run history; the Run button names the engine (Run in SAS Compute · Zeus, see Where code runs). The badge in the editor's corner is gone (it covered the first line).
Writes: reads run straight away. Statements that write anywhere but WORK (Compute) or CASUSER (CAS) ask first, as do plain SAS steps that write outside WORK or run system commands,
proc datasets,caslibstatements and the like. Writes to a shared caslib get an extra warning.Looks wrong? The editor asks before running SQL that looks like another language, e.g. a SAS library (
s2.cars) or aprocstep while the tab runs SingleStore SQL, backticks in a SAS tab, orLIMITin PROC SQL: Run as … instead, or Run anyway.Autocomplete in SAS tabs suggests libraries / caslibs, their tables (typing
lib.loads its tables) and columns – also of tables you haven't expanded in the tree. When the SQL names a table the editor doesn't know yet, it fetches its columns in the background and shows them when they arrive (typing never waits; the first SAS use starts the session, ~35 s):after
lib.table., after an alias (select c. from s2.cars c→ the CARS columns), after a table named in the statement (cars.), and for unqualified names (the columns of every table inFROM/JOIN);quoted names work:
"My caslib"."My table",'a b'n;one-level names: PROC SQL uses the tab's library (else WORK), FedSQL in CAS the tab's caslib (else CASUSER); FedSQL one-level names are WORK tables.
Round trips stay few: lookups wait until you pause (~0.35 s), every unknown table of the statement goes in one call (up to 8), each table is looked up once and cached per SAS Viya connection + library + table, and a table that doesn't exist is remembered for a minute. The cache is dropped when the active Viya connection changes, when the SAS session restarts, with the tree's ↻ and with Restart SAS session (⚙).
Backend:
sas_lookup_columns(language, tables)(app-only, read-only): Compute tables in parallel through the Compute data API (a miss is tried once more with the library's own spelling of the name), caslib tables throughtable.columnInfo.
The history keeps the language with each statement; Run runs it again as that language.
The tree lists SingleStore databases, SAS libraries or caslibs (SingleStore / SAS / CAS at its top; it follows the tab's language until you switch it). Using something from a source the tab doesn't run – choosing a library or database, inserting a name, SELECT columns, Top 100 – switches the tab's language (a SAS library → PROC SQL, or FedSQL if the tab runs FedSQL; a caslib → FedSQL in CAS; a database → SingleStore SQL): at once while the tab is empty, otherwise only after Switch to … (Keep … leaves it), so a tab's SQL is never re-labelled silently.
Show pushdown
With Show pushdown on, a PROC SQL run adds
options sastrace=',,,d' sastraceloc=saslog nostsuffix sql_ip_trace=(note, source);
(and turns it off again after), FedSQL adds _method, and CAS FedSQL runs with
method=true. The Pushdown tab then shows the SQL SingleStore received
(metadata probes such as WHERE 0=1 left out; parallel read-back streams
counted) and a verdict:
Pushed down fully: SingleStore did the work, SAS received the result;
Partly pushed down: e.g. the WHERE clause or column list went to SingleStore, SAS did the rest;
Pulled into SAS: the rows were read into SAS / CAS and processed there;
No SingleStore: nothing was sent to SingleStore.
FedSQL doesn't write the SQL it sends to the SAS log (sastrace doesn't
cover it). The SAS/ACCESS driver trace does: the automatic SingleStore library
(below) is assigned with driver_trace=SQL driver_traceoptions=APPEND driver_tracefile="<WORK>/_s2trace.log" (LIBNAME options for PROC FEDSQL / DS2).
After a FedSQL run the editor reads that file into WORK._S2TRC (not through the
log: long lines would wrap), deletes it, and the Pushdown tab lists the
statements as SingleStore got them (the DEFAULT: lines, names in their own
case; WHERE 1=0 probes left out); the verdict still comes from the FedSQL
plan (_method) – except when the trace shows SingleStore got only plain table
reads: the plan says Push Down then too (a GROUP BY with ORDER BY / LIMIT,
LIMIT alone), so the verdict is Pulled into SAS. Libraries assigned elsewhere (startup code) have no trace:
for them FedSQL shows the plan's verdict only. Tried and not working for FedSQL:
options sastrace=',,,d' / ',,,ds' (no trace lines) and
%log4sas_logger(App.TableServices, 'level=trace') (nothing in the log).
Find in Query History checks whether a statement SingleStore received is in the cluster's plan cache or the local query history (with its runs and average time) and opens the History view on it: searching for it when the History list has its runs, otherwise (every run under the 1 s trace threshold – typical for a pushed-down count) on its plan-cache entry, listed at the top, selected and marked from the SQL Editor, with its totals, parameterized text and tuning.
Ask Claude in a SAS tab
In a tab that runs PROC SQL, FedSQL or FedSQL in CAS, Ask Claude answers in
that dialect (never SingleStore SQL), as bare statements the editor wraps (no
proc sql; … quit; unless you ask for a SAS program, e.g. explicit
pass-through, a DATA step or a macro). The question carries:
the tab's language, library / caslib (and the SingleStore database behind it, so Claude can check real table and column names with its read-only tools), the library's tables (caslibs: loaded or not), the columns the editor already knows (tables in the editor's SQL first) and the tab's options;
once per Claude session and language, a compact SAS guide for that language only (
sas_guide.py, ~1.1–1.4 K tokens): how the editor wraps and splits statements, what may be written without asking (WORK / CASUSER), the dialect's rules and pitfalls, checked in SAS (see below), and the function lists from the function matrix (pushed down / runs in SAS / not available).
Pitfalls the guides cover (each one tried in the Workspace's SAS session):
PROC SQL has no LIMIT (OUTOBS in ⚙, or a plain proc sql outobs=10; step;
(obs=) limits the rows read), CALCULATED, remerging, date literals
'01JAN2024'd, explicit pass-through only as one plain SAS step
(connect using S2; reuses the library's connection – the editor's write check
treats connect / disconnect as reads, execute … by still asks).
FedSQL: one-level names are WORK (always library.table), SASHELP can't be read
(a concatenated library: copy it to WORK first), unquoted names are upper case so
lower-case SingleStore tables need S2."cars_big", no CALCULATED / data set
options / CTEs / window functions / catx, dates as DATE '2024-01-01'
('01JAN2024'd is a syntax error), LIMIT … OFFSET – which FedSQL never sends
to SingleStore (the driver trace shows a plain table read; a GROUP BY with
ORDER BY / LIMIT isn't pushed either), so select * from S2."cars_big" limit 5
reads all 20 M rows into SAS and took the test's Compute session down; PROC SQL's
(obs=5) does go down as LIMIT – , DROP TABLE … FORCE
instead of {options replace=true} (CAS only), and on a SingleStore library no
subquery in WHERE (x > (select avg(x) …) / in (select …): FedSQL pushes the
editor's whole CREATE TABLE WORK… AS to SingleStore → Unknown database
'WORK'; a join with a derived table works and is pushed down). FedSQL in CAS: only SELECT /
CREATE TABLE AS / DROP TABLE, no CTEs, ORDER BY only with LIMIT (the result
is a CAS table), only tables loaded in CAS (a SingleStore caslib's unloaded source
table "does not exist"; a session-scope load from plain SAS code lands in another
CAS session), create table CASUSER.x {options replace=true} as ….
Measured with 20 realistic questions per language (top 10 makes by average MSRP, join with a WORK table, count per month, create a table in WORK / CASUSER, date filter, explicit pass-through …), the generated SQL run in
SAS against SASHELP, the S2 library, PUBLIC / CFANS caslibs and WORK / CASUSER
(Sonnet, Balanced):
Tab language | Before (0.10.1) | After |
PROC SQL | 8 / 20 | 20 / 20 |
FedSQL | 0 / 20 | 20 / 20 |
FedSQL in CAS | 3 / 20 | 20 / 20 |
Plain SAS (asked in a PROC SQL tab) | 4 / 20 | 20 / 20 |
"Pass" = every SQL block of the answer ran without a SAS error and without
asking for a write confirmation (each answer in a fresh SAS session; runs that
failed only because Viya couldn't start a session were run again). Typical
mistakes before: LIMIT in PROC SQL, one-level names in FedSQL (WORK, not the
tab's library), FETCH FIRST / CTEs / ORDER BY without LIMIT in CAS,
catx / window functions in FedSQL, tables created in the SingleStore database
MyDB instead of WORK, SingleStore SQL (information_schema) in a SAS tab.
SAS function matrix
data/sas_functions.json says,
per function, whether PROC SQL, FedSQL and FedSQL in CAS have it and whether
it is pushed down to SingleStore, its SingleStore equivalent and what to use
instead. Sources: SAS/ACCESS to SingleStore's own function map (the LIBNAME
options SQL_FUNCTIONS_COPY= – default list – and SQL_FUNCTIONS=ALL, dumped
from Zeus), the FedSQL / CAS FedSQL / PROC SQL references on
documentation.sas.com, and a run of every function in SAS
(scripts/sas_functions.py --verify: PROC SQL and FedSQL on S2.CARS /
S2.PRDSAL, FedSQL in CAS on the SpeedyStore table CFANS.WORKFORCE_DATA;
the Pushdown verdict decides "pushed down"). It's used in three places:
the assistant's SAS guide (prefer functions that push down, say when one doesn't, suggest the alternative);
the editor's pre-run check: before a SAS statement runs, Check the functions lists functions the tab's dialect hasn't got and – when the statement reads a SingleStore library / caslib – functions that stop pushdown (Run anyway / Cancel;
vendor/sas-funcs.js, the same rules assas_functions.check);this table (
scripts/sas_functions.py --tablerewrites it from the JSON).
✓ ↓ supported and pushed down · ✓ supported, runs in SAS / CAS · ✓ (↓) CAS:
the SAS Embedded Process does part of it (e.g. the grouping) · ✓ (ALL) PROC SQL
pushes it only with SQL_FUNCTIONS=ALL on the library · ✗ not available ·
* from the documentation, not run.
Function | Category | PROC SQL | FedSQL | FedSQL in CAS | SingleStore | Instead |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | COUNT | |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | COUNT(DISTINCT) | |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | SUM | |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | AVG | |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | AVG | AVG |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | MIN | |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | MAX | |
| aggregate | ✓ | ✓ ↓ | ✓ (↓) | STDDEV_SAMP | PROC SQL: not pushed down - VAR (pushed down) and sqrt() it, or explicit pass-through with STDDEV_SAMP. FedSQL / CAS: STD or STDDEV |
| aggregate | ✗ | ✓ ↓ | ✓ (↓) | STDDEV_SAMP | PROC SQL: STD |
| aggregate | ✓ ↓ | ✗ | ✗ | VAR_SAMP | FedSQL / CAS: VARIANCE |
| aggregate | ✗ | ✓ ↓ | ✓ (↓) | VAR_SAMP | PROC SQL: VAR |
| aggregate | ✓ ↓ | ✓ ↓ | ✓ (↓) | COUNT | COUNT(x) |
| aggregate | ✓ ↓ | ✓ | ✓ (↓) | SUM(x IS NULL) | |
| aggregate | ✓ | ✗ | ✗ | MEDIAN | PROC SQL only (runs in SAS); in FedSQL / CAS MEDIAN is a row function, not an aggregate |
| aggregate | ✓ ↓ | ✓ | ✓ (↓) | MAX(x) - MIN(x) | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | ABS | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | CEILING | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | FLOOR | |
| numeric | ✓ (ALL) | ✓ ↓ | ✓ ↓ | ROUND | PROC SQL on SingleStore: ROUND isn't pushed down (only with SQL_FUNCTIONS=ALL); FLOOR(x * 100 + 0.5) / 100 is |
| numeric | ✓ | ✗ | ✗ | TRUNCATE(x, 0) | FLOOR (non-negative values) or CASE; FedSQL / CAS have no INT |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | MOD | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | SQRT | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | EXP | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | LOG | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | LOG10 | |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | SIGN | |
| numeric | ✗ | ✓ ↓ | ✓ ↓ | POWER | PROC SQL: x ** 2 |
| numeric | ✓ ↓ | ✓ ↓ | ✓ ↓ | SIN | |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | UCASE | FedSQL / CAS also have UPPER |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | UPPER | PROC SQL: UPCASE |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | LCASE | |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | LOWER | |
| character | ✓ (ALL) | ✓ ↓ | ✓ ↓ | SUBSTRING | PROC SQL on SingleStore: not pushed down (only with SQL_FUNCTIONS=ALL); filter with LIKE 'abc%' or use explicit pass-through |
| character | ✓ | ✓ ↓ | ✓ ↓ | SUBSTRING | PROC SQL: SUBSTR |
| character | ✓ (ALL) | ✓ ↓ | ✓ ↓ | LENGTH | PROC SQL on SingleStore: not pushed down (only with SQL_FUNCTIONS=ALL) |
| character | ✓ | ✓ ↓ | ✓ ↓ | TRIM | PROC SQL on SingleStore: STRIP (pushed down as TRIM) |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | TRIM | |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | RTRIM | |
| character | ✓ | ✓ ↓ | ✓ ↓ | LTRIM | PROC SQL on SingleStore: STRIP (pushed down) |
| character | ✓ (ALL) | ✓ ↓ | ✓ ↓ | REPLACE | PROC SQL on SingleStore: TRANWRD(x, ' ', '') (pushed down as REPLACE) |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | REPLACE | |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | LOCATE | |
| character | ✓ | ✓ ↓ | ✓ ↓ | LOCATE / INSTR | INDEX (PROC SQL: pushed down as LOCATE) |
| character | ✓ | ✓ ↓ | ✓ ↓ | SUBSTRING_INDEX | explicit pass-through with SUBSTRING_INDEX |
| character | ✓ | ✗ | ✗ | CONCAT_WS | Not in FedSQL / CAS: trim(a) || ' - ' || trim(b). PROC SQL on SingleStore: a || ' - ' || b pushes down (catx() doesn't) |
| character | ✓ | ✗ | ✗ | CONCAT(TRIM(..)) | trim(a) || trim(b); PROC SQL on SingleStore: a || b pushes down |
| character | ✓ ↓ | ✓ ↓ | ✓ ↓ | CONCAT | FedSQL / CAS keep CHAR padding: trim(a) || trim(b) |
| character | ✓ (ALL) | ✓ ↓ | ✓ ↓ | REPEAT | |
| character | ✓ (ALL) | ✗ | ✗ | SOUNDEX | PROC SQL only |
| character | ✓ | ✓ ↓ | ✓ ↓ | REVERSE | |
| character | ✓ | ✓ ↓ | ✓ ↓ | - | |
| character | ✓ | ✗ | ✗ | - | PROC SQL only; FedSQL / CAS: nested REPLACE-style tranwrd() |
| character | ✓ | ✓ ↓ | ✓ ↓ | COALESCE | COALESCE (PROC SQL: pushed down) |
| date | ✓ ↓ | ✓ ↓ | ✓ | CURDATE() | CAS: compare with a DATE literal (TODAY() keeps the query in CAS) |
| date | ✓ ↓ | ✓ ↓ | ✓ ↓ | YEAR | |
| date | ✓ ↓ | ✓ ↓ | ✓ ↓ | MONTH | |
| date | ✓ ↓ | ✓ ↓ | ✓ ↓ | DAYOFMONTH | |
| date | ✓ ↓ | ✓ ↓ | ✓ ↓ | QUARTER | |
| date | ✓ ↓ | ✓ ↓ | ✓ ↓ | DAYOFWEEK | |
| date | ✓ | ✓ ↓ | ✓ ↓ | DATE_ADD | PROC SQL on SingleStore: filter with date literals, group with YEAR() / MONTH() (pushed down) |
| date | ✓ | ✓ ↓ | ✓ ↓ | TIMESTAMPDIFF / PERIOD_DIFF | PROC SQL on SingleStore: YEAR() / MONTH() arithmetic, or explicit pass-through with TIMESTAMPDIFF |
| date | ✓ | ✓ ↓ | ✓ ↓ | MAKEDATE | a date literal ('01JAN2024'd / DATE '2024-01-01') |
| date | ✓ (ALL) | ✗ | ✗ | DATE | PROC SQL only (FedSQL / CAS: CAST(x AS DATE)) |
| date | ✗ | ✗ | ✗ | EXTRACT | YEAR() / MONTH() / DAY() |
| date | ✗ | ✓ ↓ | ✓ | CURRENT_DATE | PROC SQL: TODAY() |
| conversion | ✓ | ✓ | ✓ ↓ | DATE_FORMAT | group by YEAR(d), MONTH(d) (pushed down) and format the result |
| null | ✓ ↓ | ✓ ↓ | ✓ ↓ | COALESCE | |
| null | ✓ | ✗ | ✗ | IF() | CASE WHEN … THEN … ELSE … END (pushed down everywhere) |
| null | ✓ | ✗ | ✗ | IF() | CASE WHEN … THEN … ELSE … END (pushed down everywhere) |
| null | ✗ | ✓ ↓ | ✓ ↓ | NULLIF | PROC SQL: CASE WHEN x = v THEN . ELSE x END |
| null | ✓ | ✓ ↓ | ✓ ↓ | x IS NULL | x IS NULL (pushed down) |
| conversion | ✓ | ✓ | ✓ ↓ | FORMAT | aggregate first, format in the result (format= in PROC SQL) |
| conversion | ✓ | ✗ | ✗ | - | PROC SQL only; FedSQL / CAS: CAST(x AS DOUBLE) |
| conversion | ✗ | ✓ ↓ | ✓ ↓ | CAST | PROC SQL has no CAST: PUT / INPUT |
Notebook
Cells
SQL cells run against SingleStore. The result shows as a grid and becomes the pandas DataFrame
df(and a named variable if you fill in result →). Several statements per cell are fine; writes ask first.Python cells run on an IPython (Jupyter) kernel with pandas (
pd), matplotlib (inline charts) andconn(a SingleStore connection).SAS cells run SAS code (DATA steps, PROCs, PROC SQL) on your SAS Viya, with the ODS output and the log (errors and warnings counted, the log opens when there are errors). See SAS cells below.
Text cells are Markdown with embedded HTML, as in Jupyter (styled headers, images, alert boxes); scripts are stripped.
Shift+Enter runs and moves on, Ctrl+Enter runs, Alt+Enter runs and adds a cell. The header has Run all, interrupt ■ and restart ↻, plus the kernel's status.
Interrupt stops Python code at once, also a long
time.sleep()on Windows. A call waiting in C code can't be interrupted on Windows (a network read, a lock, a long numpy / C loop such assum(range(10**10))): if the cell still runs 5 s after ■, the cell offers Restart kernel, which stops it (variables are cleared).
SQL from Python (SingleStore Notebooks compatible)
rows = %sql SELECT …returns rows (rows[0][1],pd.DataFrame(rows),rows.DataFrame());%sql name << SELECT …stores the result inname.%%sql [name <<]cells, and{{ variable }}to insert Python values.connection_url(andSINGLESTOREDB_URL, used bys2.connect()/s2.create_engine()) follows the database selected in the notebook.Magics and Python writes run without the app's confirmation, as in Jupyter.
Notebooks and files
Several notebooks open as tabs, each with its own kernel. New opens a new tab; Open loads into a new tab unless the current one is empty. Closing a tab stops its kernel (unsaved tabs need a second click).
Open and Save as are a large dialog over the notebook, as in the SQL Editor; Escape or Close / Cancel closes it.
Saved as standard
.ipynbfiles, with SQL cells as%%sqland SAS cells as%%sascells, so they open in Jupyter / VS Code and SingleStore Notebooks, and SingleStore's example notebooks open here.
Python environment and packages
Python runs in its own environment,
~/.singlestore-mcp/notebook-env, installed withuvthe first time (the notebook offers an Install button). It has what SingleStore's examples expect: pandas, matplotlib, singlestoredb, SQLAlchemy with the SingleStore dialect, ibis, scikit-learn, and SAS's Python packages: saspy, swat (CAS), DLPy (sas-dlpy), sasctl and sasoptpy.Packages lists what's installed (with filter) and installs more.
%pip install …and!pip install …in a cell also install into this environment. Restart the kernel (↻) after installing.The environment is shared by every notebook, by Claude and by the desktop window, and survives restarts.
Windows specifics handled for you:
pandarallel'sparallel_applyruns as plainapply, and Hugging Face downloads use plain HTTPS (its newer download method stalls on some corporate networks).Code runs with your user rights on this machine, like any local Jupyter. Kernels stop after 30 idle minutes; SQL cells fetch at most 100,000 rows.
SAS cells (SAS Viya)
Set up once in Connect → SAS Viya connections: + New Viya connection (a name, the Viya address and the compute context, e.g. SAS Studio compute context; Test lists them), then Sign in on its card. Sign-in uses your own Viya account (OAuth with Viya's built-in
vscodeclient): SAS Logon opens in the browser and shows a code to paste once; after that the sign-in renews itself. If you already signed in with the SAS Viya MCP server or the SAS Viya CLI, Test reuses that sign-in for a connection to the same Viya.SAS cells use the active SAS Viya connection. A new kernel picks up the connection that is active when it starts; restart the kernel after Use on another one.
+ SAS adds a SAS cell. The code runs in a SAS Compute session on Viya (one per notebook, started on the first SAS cell, which takes about half a minute; restart the kernel for a fresh one).
SingleStore from SAS: each session gets the library S2 on the notebook's SingleStore database (SAS/ACCESS to SingleStore, engine
SSTORE), so a DATA step canset s2.mytable;or writedata s2.newtable;. The password isn't echoed to the SAS log. This needs a password connection (not JWT / SSO); the libref name can be changed in the settings.Let Viya read SingleStore directly. SAS reads and writes SingleStore itself through S2 (and SAS/ACCESS pushes
WHEREclauses and PROC SQL down to SingleStore); CAS reads it through a SingleStore-backed caslib (SAS Data Connector to SingleStore / SpeedyStore). Don't pull SingleStore data into the notebook's Python and upload it to Viya: that round trip through your machine is slow and unnecessary. Claude in the notebook follows the same rule.From Python:
sas_session()is the saspy session,cas_session()a swat CAS connection (use it with DLPy) andsasctl_session()a sasctl session, all signed in with the same Viya sign-in.sas_to_dfanddf_to_sasexist for small, local results only.Claude in the notebook knows about SAS cells and suggests them in ```sas blocks with an Insert SAS cell button.
Claude
The Claude button opens a chat panel that sees the notebook's cells and outputs, checks the database (read-only) and answers with SQL or Python you insert as a new cell, or use to replace the selected one.
Connections
SAS Viya connections (bottom of the Connect view) work like the SingleStore ones: several saved connections, one active. SAS cells in notebooks, the Schema Explorer's SAS libraries / CAS sources and the SQL Editor's Run as PROC SQL / FedSQL / CAS use the active one.
+ New Viya connection / Edit: name, Viya address, compute context, client ID (default
vscode), certificate check, SingleStore libref and, for SAS in the Workspace, CAS server and startup code (below). Save and use also makes it the active one.Each card shows whether it's signed in (as whom, how long the token is valid, whether it renews itself) with Use (make it active), Sign in / Sign in again, Test, Sign out, Edit and Delete.
Sign in only signs in: it opens SAS Logon for that saved connection and asks for the code; it never saves the form. Each connection keeps its own sign-in (tokens in the OS credential store, never shown to the app or Claude). Renaming a connection keeps its sign-in, changing its address to another Viya drops it, Delete removes it.
Use on another connection ends the Workspace's SAS Compute / CAS sessions (the next run starts them on the new Viya); new notebook kernels use it. The Schema Explorer's SAS sources and the SQL Editor's SAS options (⚙, and next to the library picker when there are several) show the active Viya connection and switch it.
The list (no tokens) is in
~/.singlestore-mcp/sas.json. An older single-settingssas.jsonbecomes one connection, named after the Viya host, that keeps its sign-in; one without an address becomes an empty list.
Per connection, for SAS in the Workspace:
CAS server (default
cas-shared-default).Startup code: SAS code run once when the Workspace's SAS session starts, typically
%includeof the files that assign your libnames, e.g.filename inc filesrvc folderpath='/Users/me/My Folder/mcp' filename='s2_libname.sas'; %include inc / nosource2; filename inc clear;It runs with
options nosource nosource2and its log is never shown or kept (only the number of errors and the first error line, passwords masked), so the libname files' contents stay hidden. Don't put passwords in the startup code itself. Saving a connection with other session settings (address, compute context, CAS server, startup code, SAS 9 sign-on) restarts that connection's SAS sessions; ⚙ → Restart SAS session in the SQL Editor does too (for the tab's connection). Switching the active connection restarts nothing: every connection has its own SAS sessions.Automatic SingleStore library (on by default; a checkbox in Edit): when the Workspace's SAS session starts, it gets the SingleStore libref (default
S2) on the active SingleStore connection and its default database – the sameLIBNAME S2 SSTORE server= port= user= password= database=the notebook kernels use. It's assigned before the startup code (which can override it), and again before the next SAS run when the active SingleStore connection, its settings or its password change. The password comes from the credential store and is submitted withoptions nosource nonotes, so it never appears in the SAS log, the Log tab, the history or tool results (error text is masked; the job is deleted from the session afterwards). Token connections (JWT / Entra ID) use the token as the password and are re-assigned when it's renewed (Entra renews a few minutes before expiry); connections with a URL get no library. It shows in the SAS libraries as an S2 library marked automatic, with its database. On Zeus this replaces the compute context's ownS2; turn it off to keep that one.Start the SAS session when the Workspace opens (on by default; a checkbox in Edit): see SAS session started in the background below.
SAS 9 sign-on code, SAS 9 server, SAS 9 libraries (optional): SAS 9 through SAS/CONNECT, see Schema Explorer: SAS 9 libraries below.
The Workspace keeps one SAS Compute session and one CAS session and reuses them (the first use starts the session, which can take half a minute).
The Connect view (also the connections_window tool) manages saved
SingleStore connections. One connection is active at a time: every view,
Claude's tools and new notebook kernels use it. The rail's tooltip shows which
one.
+ New connection: name, host, port, user, password, default database, TLS on/off, or a full connection URL.
TLS certificates: a CA certificate (PEM) to verify the server, with Browse… and Use SingleStore Helios CA (downloads SingleStore's
singlestore_bundle.pemto~/.singlestore-mcponce), Verify the server's certificate, and optional client certificate + key. Helios requires the CA (otherwise: "1251: No SSL detected"). Only the file paths are saved. For the Environment variables connection useSINGLESTORE_SSL_CA,SINGLESTORE_SSL_CERT,SINGLESTORE_SSL_KEYandSINGLESTORE_SSL_VERIFY. Test tries it before saving; Save and connect makes it active right away.Authentication: Password, JWT token (paste a token from your identity provider, for users created
IDENTIFIED WITH authentication_jwt; stored like a password, and the card shows how long it stays valid) or Browser SSO (SingleStore Helios): Sign in opens SingleStore's sign-in page in your browser, and the token is cached until it expires, or Microsoft Entra ID (SSO): no app registration needed, just your UPN as the user (tenant, client ID and scope are optional). Sign in first uses the account you're signed in to Windows / macOS with (on an Entra-joined laptop usually without any prompt), otherwise Microsoft's sign-in page in the browser; after that, tokens are renewed silently, also inside running notebook kernels. One sign-in serves all views, notebook kernels and Claude. Token logins need TLS (for Helios: Use SingleStore Helios CA). When a token expires, new connections ask you to sign in again or paste a new token; for the Environment variables connection setSINGLESTORE_CREDENTIAL_TYPE=jwtand put the token inSINGLESTORE_PASSWORD.Each saved connection has Connect, Test, Edit and Delete.
Your existing
SINGLESTORE_*settings appear as the built-in, read-only connection Environment variables, so nothing changes until you add more.After a switch, the Schema, Pipelines and Cluster views reload and the SQL Editor refreshes its databases. Open notebooks keep their kernel (and variables) on the old connection until you restart it; they offer a Restart kernel now button.
Claude can switch too:
list_connectionsanduse_connection(name)(e.g. "switch to the test cluster").
Where things are stored: the connection list (no passwords) in
~/.singlestore-mcp/connections.json. Passwords go to the operating system's
credential store via keyring: Windows
Credential Manager, macOS Keychain or the Secret Service on Linux. Where there
is none (e.g. a headless Linux server) they go to an encrypted file in
~/.singlestore-mcp whose key only your user account can read. Passwords are
never sent back to the app. Secrets too large for Windows Credential Manager
(Entra ID tokens) go to ~/.singlestore-mcp/secrets-large.enc, encrypted with
a key kept in Credential Manager.
Setting up Microsoft Entra ID logins (self-managed cluster). No app
registration is needed: by default the sign-in uses Microsoft's Azure CLI
public client (available in every tenant) and requests the Azure OSS
database token (https://ossrdbms-aad.database.windows.net), the same token
Azure Database for MySQL / PostgreSQL accept for Entra logins. Only the
cluster needs setting up (its nodes must reach login.microsoftonline.com):
SET GLOBAL jwks_endpoint = 'https://login.microsoftonline.com/<tenant ID>/discovery/keys';
SET GLOBAL jwks_username_field = 'upn';
CREATE USER 'jonas@company.com'@'%' IDENTIFIED WITH authentication_jwt REQUIRE SSL;
GRANT SELECT ON mydb.* TO 'jonas@company.com'@'%';Then in Connections: Microsoft Entra ID (SSO), your UPN as the user, TLS
on → Save → Sign in. After a sign-in whose test fails, the card shows
the exact jwks_endpoint, jwks_username_field and user the cluster needs.
Use the
/discovery/keys(v1) key list: the database tokens are v1 tokens, and the keys in the/discovery/v2.0/keyslist carry a v2 issuer that doesn't match them, so the cluster rejects the token.The database user must be spelled exactly as in the token's
upn, upper and lower case included (e.g.'Jane.Doe@company.com'@'%'); after Sign in, the connection takes the token's spelling.SET GLOBAL jwks_require_audience = 'https://ossrdbms-aad.database.windows.net';makes the cluster accept only tokens issued for database logins.Entra's signing keys sign tokens for every app in the tenant, and SingleStore maps tokens to users by the user-name claim only, so create database users only for people who should have access.
upnis only issued for verified domains, which is why it's the default rather thanpreferred_username.Some tenants block the Azure CLI app with conditional access. Then register an app of your own (public client, redirect URIs
http://localhostandms-appx-web://Microsoft.AAD.BrokerPlugin/<client ID>, an exposed API scope) and enter its client ID; tokens then come forapi://<client ID>/.default.
Schema Explorer, Pipeline Monitor, Cluster Monitor, Query Grid
App (tool) | What it shows and does |
Schema Explorer | Databases (with a bottomless / local icon) → tables with row counts and sizes; per table the columns, DDL (shard / sort keys), a row preview and its Distribution (data skew over partitions and leaves); Check skew for a whole database. Ask Claude, Query in grid and Analyze… (refresh statistics, with confirmation). |
Pipeline Monitor | Every pipeline's state, source → table, progress (files loaded / Kafka lag), latest batches and errors. Start / Stop (with confirmation), Test, error details, Ask Claude, auto-refresh. |
Cluster Monitor | Tabs Overview (per node SingleStore CPU against its core limit, memory and disk, beside a 15-minute CPU chart), Health (node and partition state, cluster events, license, problems explained), Queries (running now, plus every statement that ran in the last 60 s), Disk, Bottomless, IO, History (CPU, memory, disk, queue and connections over 1 h / 24 h / 7 d) and Backups. Refreshes every 5 s. |
Security | Users with risk flags, effective privileges with the reason for each, "who can access …", resource pools and the workload manager queue, audit log settings. Changes (users, grants, roles, groups, pools) only in the view, each previewed and confirmed, or written to a SQL script for a DBA. See Security. |
Config | Every engine variable per node, with the documented default; filter on changed from default / differs between nodes. See Config. |
Clean up | Finds the work tables SAS jobs leave behind ( |
Query History | Every finished query the cluster traced: when, how long, user, database, rows, success / error, and a probable Source (SAS CAS, SAS in-database). Filter on runtime (1 s and up), period, user, database, status, type, source and text; sort by time, duration or rows. Repeated statements are grouped; statements only in the plan cache can be added. Select a query for its full SQL and Get tuning recommendations (plan tree, statistics, SAS EP card). Tabs Queries, Trends, Usage and Advisor. Its own History item in the workspace rail. |
Alerts | Alerts the server raises while it watches the cluster in the background: queries running too long, slow or failed queries, failed pipeline batches and pipeline errors, node memory and disk over a threshold, nodes not online. Edit the rules, acknowledge, clear. Its own Alerts item in the workspace rail, with a red badge counting the unacknowledged alerts. |
Workload | Saved sets of SQL statements, each with how often it runs, replayed against the cluster with N connections for a set time; live throughput and latency, then compare two runs statement by statement (e.g. before and after a new sort key or index). Its own Workload item in the workspace rail. |
Query Grid | Read-only results as a sortable, filterable grid with CSV export; the SQL can be edited and re-run. Writes are refused. Reading stops after |
TEST PIPELINE loads no data, but a failed test is still recorded in the
pipeline's batch history and error log.
Schema Explorer: SAS libraries and caslibs
The switch above the tree picks the source: SingleStore, SAS libraries (the Workspace's SAS Compute session on Viya: what the compute context assigns plus the startup code) or CAS (caslibs on the CAS server).
Libraries → tables → columns with type, length, format and label, and a Preview of the first 50 rows. For caslibs the tree shows tables loaded in memory and the source tables behind them (for a SingleStore caslib, the tables of its database).
SingleStore libraries and caslibs are badged by kind (Schema Explorer tree and SQL Editor tree / library picker), with a tooltip naming the kind and the SingleStore database:
SS (SingleStore purple) – caslib type
SingleStore: the SAS SpeedyStore integration, CAS pushes queries down to SingleStore live (no in-memory copy), e.g.CSASDPon Zeus;S2 (grey-blue outline) – caslib type
singlestore_standard: the standard SingleStore data connector, CAS loads the tables into memory, e.g.SASDP/SASDPSTDon Zeus;S2 – SAS/ACCESS to SingleStore libnames in Compute (engine SSTORE), including the automatic one;
9 – SAS 9 libraries through SAS/CONNECT.
They show their database with Open … in SingleStore to jump to it in the SingleStore source.
</> Show code on a library or caslib: the statement that would assign it again, reconstructed from its current settings –
LIBNAMEfrom the session'sdictionary.libnames(engine, path, server, user, database; SAS doesn't report the port or other engine options), and for a caslib theCASLIB … datasource=(srctype=… …)statement plus thetable.addCaslibequivalent fromcaslibInfo(verbose). Passwords, tokens and authentication domains are placeholders (password="<set password>"), never real values. Copy or Open in SQL Editor (a new tab, runs as plain SAS – nothing is run).Query in SQL Editor opens the first 100 rows in the SQL Editor, running as PROC SQL (libraries) or FedSQL in CAS (caslibs) in that library.
Backend (app-only tools):
sas_sources,sas_libraries,sas_tables,sas_columns,cas_caslibs,cas_tables,cas_columns,sas_library_code,cas_caslib_code,sas9_libraries(each takes an optionalconnection: a saved SAS Viya connection, default the active one). The SQL Editor's runs:sas_query/sas_execute(background run withrun_id,wait_ms,connection,table_rows),sas_run_status,sas_stop,sas_rows(paging),sas_session_reset(connection).
Schema Explorer: SAS 9 libraries (SAS/CONNECT)
Set up per SAS Viya connection (Connections → SAS Viya → Edit): SAS 9 sign-on code (e.g.
%includeof the signon file you keep in SAS Content, such ascauki_signon.sas), SAS 9 server (the remote session name in itsSIGNON, e.g.CAUKI) and optionally SAS 9 libraries (remote librefs,local=REMOTEto rename; empty = all but SASHELP, WORK, SASUSER, MAPS…).The SAS 9 source (shown once the active Viya connection has a sign-on) signs on from the Workspace's SAS Compute session – once per session, with
NOSOURCE/NONOTES, its log never shown – and assigns the remote libraries with remote library services (libname STG server=CAUKI slibref=STG). A libref already in use in the session is skipped. They're then ordinary SAS libraries: tables, columns, preview, PROC SQL in the SQL Editor, and they also appear under SAS libraries (badge 9).CAUKI is shut down every evening at 22:00: the sign-on then fails with Couldn't sign on to SAS 9, which is expected. ↻ Reload libraries signs on again.
Schema Explorer: data skew (Distribution)
A table's Distribution tab, and Check skew on a database, show how evenly rows and data are spread over the partitions and leaves. Read only when you open the tab or press the button (two parallel queries on
information_schema.TABLE_STATISTICS, master partitions, andCOLUMNAR_SEGMENTSfor disk size), never on a tree click.Per table: skew (even / some / high / too small to matter), row variation (relative standard deviation of rows per partition, the docs' skew score; under 10 % is fine), largest vs even ((max − avg) / avg), data variation, the largest partitions, rows per partition and per leaf with bars, and the shard key. Tables under 10,000 rows count as too small to matter.
With skew it explains the likely cause in plain words: a shard key on a low-cardinality column or a few very common values (with buttons that put read-only checks of the key's values in the SQL Editor), a keyless table filled by
INSERT … SELECT(fix: copy withWITH(force_random_reshuffle=1)), or partitions placed unevenly over the leaves. A shard key can't be changed withALTER TABLE; the note says how to rebuild, with links to the SingleStore docs (Detecting and resolving data skew, Shard keys).Check skew on a database lists every distributed table, worst first, plus rows per leaf; click a table for its details. Backend:
schema_explorer_skew(database, table?)(app-only, read-only).Reshard simulation (bottom of the Distribution tab): tick the columns of a candidate shard key and press Simulate to see how the rows would spread over the partitions – predicted rows per partition next to today's, the predicted row variation against the current one, distinct key values, and a note when the key has too few values. Nothing changes: it is the docs' query (Detecting and resolving data skew → reshard on another column),
SELECT WITH(leaf_pushdown=true) SUM(c), PARTITION_ID() FROM (SELECT COUNT(*) c FROM t GROUP BY <key>) GROUP BY PARTITION_ID(), which hashes each key value to the partition it would land on. It reads the whole table, so it only runs on the click, with the row count shown first (a warning from 1 million rows); Sample … rows estimates from a random sample (WHERE RAND() < f, scaled up; every row is still read, but fewer are moved and grouped). Query in SQL Editor shows the query. Backend:schema_explorer_reshard(database, table, columns, sample_rows?)(app-only, read-only).
Schema Explorer: bottomless and Analyze
Each database shows a cloud icon if it is bottomless (unlimited storage) or a disk icon if it is local-only. Hover for where its data lives: for bottomless databases the provider and remote bucket/directory (
MV_BOTTOMLESS_DATABASES,MV_BOTTOMLESS_STATUS), otherwise the data directory on each node.Analyze… on a table and Analyze all tables… on a database refresh optimizer statistics with
ANALYZE TABLE. First a read-only plan lists each table's statistics fromOPTIMIZER_STATISTICS: when they were last updated, outdated or missing columns, histograms, and row-count drift. It marks stale tables and shows the exact statements. After you confirm (it changes the shared cluster), tables run one at a time with progress and Stop, and each gets its own result. ANALYZE reads the table and invalidates cached plans built on stale statistics. Backend:schema_explorer_analyze_planandschema_explorer_analyze(confirm=True), at most 10 tables per call.
Cluster Monitor tabs
Overview: the CPU chart beside the node cards (CPU, memory, disk). The chart's height follows its width, so it stays readable in a wide window. CPU and disk rates are differences of counters between two reads. The metrics sampler takes a first read in the background about 8 s after the server starts (and keeps it fresh), so opening the Cluster view doesn't wait a second for one; only with the sampler off does the first open measure over a second.
Queries: Running now from the process list, and Ran in the last 60 s from the aggregators' plan caches, which also shows the many short statements that finish between two refreshes (constants shown as
^/@; run counts are since the plan was compiled). A Queued badge opens the resource pools in the Security view.Disk: per mount total, used and free with a SingleStore / other / free split; nodes on one shared file system are grouped and their figures are for the whole mount. Per node, SingleStore's own files by type (columnstore data, transaction logs, rowstore snapshots, temporary blobs, plan cache, trace and audit logs, system files), the blob cache against its limit, query spilling, and the largest databases and columnstore tables. Directory sizes are measured at most once a minute (Measure again forces it).
Bottomless: traffic to and from object storage per node and per database: upload, fetch and evict MB/s (from counter deltas), totals, GET/PUT rates, upload lag, pending and failed requests, rate limiting, the engine's own rates and recent blob cache events. Measure remote storage reads
MV_BOTTOMLESS_REMOTE_STATSon demand, because it queries the object store.IO: session charts of disk read/write MB/s per node and blob cache fetched/evicted/uploaded MB/s, current throughput (IOPS where the device reports them), and the cached plans that waited most on the blob cache. SingleStore 9.0 has no blob cache hit counter, so no hit ratio is shown.
Health: one banner (healthy / things to check / action needed) and the problems found, worst first, each with a plain explanation, a Docs link to docs.singlestore.com and Ask Claude. Below: nodes (state, role, availability group, leaf pair, ping latency, version, uptime), databases and their partitions (healthy / degraded / offline; masters, replicas, online, replicating, recovering, offline, unrecoverable, orphan partitions), replication to another cluster (lag, catch-up time) when there is any, the cluster's own events (
MV_EVENTS: node failures, rebalances, memory and disk limits, stopped pipelines …) and license / version. Critical: a node or partitions offline, unrecoverable partitions, license capacity exceeded. Check: a degraded database, orphan partitions, failure events in the last 24 h, replication lag, an expired or expiring license. Info: no high availability (redundancy_level1), a rebalance running. Only documented 9.0 views are read (MV_NODES,LEAVES,AGGREGATORS,MV_DISTRIBUTED_DATABASES_STATUS,DISTRIBUTED_PARTITIONS,MV_REPLICATION_MANAGEMENT_ORPHANS_STATE,MV_AGGREGATED_REPLICATION_STATUS,MV_EVENTS, license status variables on the master aggregator; never the license key), in one parallel round trip, every 30 s while the tab is open.History: per node SingleStore CPU, memory (% of max_memory), disk (% of the data mount), queued queries (peak), running queries and connections for the last 1 hour, 24 hours or 7 days (one point per 1, 5 or 30 minutes), with the same node colors and filters as the other charts. The server samples the cluster once a minute in the background (one round trip, starting about 20 s after the server so it never slows the start) and keeps the samples in
~/.singlestore-mcp/metrics.db, per cluster. Raw samples are kept for 24 h, older ones as 10-minute averages (with the CPU and queue peaks), for 7 days. Gaps are times no server ran. The Claude server and the desktop Workspace share the file and take one sample a minute between them. Sample now adds one at once. Settings:SINGLESTORE_MCP_METRICS=0(off),SINGLESTORE_MCP_METRICS_INTERVAL(seconds, 15–300, default 60),SINGLESTORE_MCP_METRICS_RETENTION_DAYS(1–90, default 7). Export CSV saves the range shown (one row per point and node: time in UTC, node, host and the values the charts show). The Alerts view's trend rules (disk full / memory at max_memory within N days) read the same store.Backups: per database the last successful backup, its age, type, size and how long it took, the number of backups and failures and the last error; the backup history (newest first) and backups running now with their progress (
MV_BACKUP_HISTORY,MV_BACKUP_STATUS). Flags databases whose last backup failed or whose last good backup is older than 1 / 7 / 30 days, and databases with no backup in the history. The history only holds backups made withBACKUP DATABASEon this cluster; volume snapshots and the like don't show. Read-only: the app never starts a backup.
The extra tabs only query the cluster while they are open (History reads only the local store).
Clean up lives in the Schema Explorer (the 🧹 Clean up button in its
header, or ask Claude to "clean up the SAS work tables"). It scans all
databases except the system ones (information_schema, memsql, cluster,
sys, mysql, performance_schema) in two rounds of queries, whatever the
number of tables:
Name patterns: one per line, a pattern and a label, e.g.
_dm* SAS DM.*and?are wildcards, case-insensitive. The defaults are_dm*,_flw*,SASTMP*and_tmp*. Optionally it also offers every table not created or altered for N days. The settings are kept in~/.singlestore-mcp/cleanup.json.Last used is the most recent query in the query history that names the table (see Query History above; only queries above its duration threshold are recorded, so "never seen" is no guarantee). Tables used or created in the last N days (default 7), and tables that a view depends on, are marked risky.
Dependent views block a table's drop unless you tick them in the confirmation; they are then dropped first.
Dropping: select tables (or Select all / Select not risky), then the confirmation lists the exact statements and the total size. Each object is dropped with its own
DROP TABLE IF EXISTS \db`.`table`` and gets its own result (dropped / error). Dry run is on until you turn it off: it only shows the statements. The server checks everything again before dropping.Every drop is logged (time, cluster user, Windows user, connection, table, rows, size, result) to
~/.singlestore-mcp/cleanup-log.jsonl; the panel shows the recent entries.
Query History needs SingleStore's query history (event tracing) turned on once, by an admin:
CREATE EVENT TRACE Query_completion WITH (Query_text = on, Duration_threshold_ms = 1000);Its tuning recommendations work without Claude. For the selected run they combine:
the run itself: rows returned or written,
SELECT *, no filter,CREATE TABLE … AS SELECTwithout a shard key, errors such as unreachable Kafka brokers;the plan cache: disk spilling, time queued by workload management, memory, plan warnings, outdated statistics;
EXPLAIN(compiles the statement without running it): missing column statistics (with theANALYZEcommands), broadcasts, reshuffles, nested-loop joins, filtered scans of tables without a sort key;the tables' shard and sort keys.
The header shows what the history records, e.g. Tracing queries ≥ 1 s +
failures. Click it for the Query_completion event trace settings per node
(threshold, query text, failed queries, enhanced stats, memory, events traced
and unconsumed), read from MV_TRACE_EVENTS_STATUS. It's read-only: changing
the trace needs ALTER EVENT TRACE.
Group repeated statements (on by default) merges runs of the same statement (same text once literal values are replaced, same database) into one row with count, average, p95, max, last run and users; open it to see and select the individual runs.
Plan cache. The trace keeps only runs over its threshold; the plan cache
keeps every statement's totals since its plan was compiled. Each refresh
copies the aggregators' plans into query_history.db (so they survive
eviction and restarts). Traced statements show their plan-cache totals (all
executions, average time, memory, spilling, blob cache), and Plan cache
statements (a checkbox, off by default) adds the statements the trace never
kept, labelled as aggregates.
Plan view. Tuning shows the plan as a tree (from EXPLAIN JSON, which is
never cut short): one box per operator with estimated rows, filters and keys,
and the expensive parts marked: broadcasts, reshuffles, large hash builds,
nested-loop joins on large inputs, filtered full scans of tables without a
sort key, large gathers. Profile (runs it), for read-only SELECT / WITH
only and after a confirmation, runs the query once more with PROFILE and
shows actual rows, time, memory, spills and segments skipped per operator;
it's cancelled after 5 minutes. Raw EXPLAIN / JSON / profile JSON are one
click away.
Statistics. In tuning, Check statistics… shows the statistics age and
staleness of the tables the query reads, with the exact ANALYZE TABLE
statements (via the Schema Explorer); Analyze table(s) runs them after a
confirmation.
SELECT * is flagged only when it costs something: not for SAS Embedded
Process calls, metadata probes (WHERE 0=1, LIMIT 0), SAS work tables,
SELECT * FROM (SELECT cols…), or tables with one or two columns.
SAS EP calls. For SAS Embedded Process calls (sasepFunction(…)), tuning
shows a SAS EP card instead of generic advice. The call is an external
function, so EXPLAIN shows nothing inside it; the plan cache counts the
call's wall time but almost no CPU (SingleStore waits for the EP). The work happens in the statement the EP
generates (CREATE TABLE … AS SELECT … FROM <input> JOIN <per-job EP function>), which runs on the leaves partition by partition. The card shows:
the input table's skew: rows and size per partition, largest / average, and the time lost waiting for the largest;
partitions vs leaf cores, using the container's CPU limit;
how much data goes into the EP: rows, bytes and columns, whether a filter is applied before the EP, and whether the input's sort key lets that filter skip segments;
disk / blob-cache waits, memory, spilling and queueing from the plan cache;
the job's runtime over time as a sparkline.
Each point is judged Fine / Worth a look / Problem, with a next step such as
resharding the input, a filter before the EP call, or a sort key. EP calls are
never profiled, since that would run the SAS job again, and the password SAS
puts into the call is masked as *** wherever the SQL is shown (Copy SQL
still copies the original).
SAS VA / CAS EP queries. SAS Visual Analytics and CAS queries that join
with per-job EP format functions (… FROM (SELECT * FROM db.t) AS t JOIN EP.h…_EP(cols) AS ep) are labelled SAS EP and get the SAS EP card too, marked
VA / CAS format function. The function's name changes every run, so the
history matches runs by the statement with that name left out. The card shows:
for CAS parallel loads (one statement per partition,
WHERE partition_id() = N), each partition's runtime in that load, which shows skew directly;the input table's skew and partitions vs leaf cores;
how much data reaches the EP: rows, bytes and the columns passed to the function (a
SELECT *in the derived table costs little, since only those columns are read), and whether a filter applies before the EP and can skip segments through the sort key;plan-cache waits, memory, spilling and queueing when the plan is still known (each run is a new, short-lived plan, so it often isn't);
the statement's runtime over time;
how this run compares with every other EP call. On clusters where most EP calls take the same few seconds whatever they read, that's a fixed wait on the EP side, and the card says so.
Both kinds of EP card also show:
Where the time went: a bar split into measured and estimated parts. For a sasepFunction job whose generated statement is in the trace: time before the EP sent its SQL, the generated statement itself, and the rest. Otherwise queueing (plan cache), the estimated fixed wait (this call minus the median of EP calls that ran on their own off the plateau) and the rest; plus the plan cache's CPU time, which shows whether SingleStore was working or waiting.
The fixed-wait plateau: the runtime band most traced EP calls share (found from the data, ±4 %), a histogram of all EP runtimes, and a straight-line fit of time against rows returned (per call vs per row cost).
EP calls running at the same time: overlapping calls, whether they finished together although they started seconds apart (one shared wait), and many small calls (≤ 10 rows each) that would be cheaper as fewer queries.
The EP's own statement failed: the generated
CREATE TABLE … AS SELECTfailed (e.g. the output table already exists) although the sasepFunction call itself completed normally.SELECT *through the EP for jobs: every input column goes into the EP (KEEP= / DROP= on the input).Tuning tips, each marked Measured (seen in this cluster's data), Documented (with the source) or Hypothesis (to verify), with links.
EP overview (Usage tab). EP calls over the chosen period by source (SAS
job / SAS VA / CAS), database and user: calls, total and median time, how many
sat on the plateau and how much time that was, failures, overlapping groups
that shared one wait, and how many VA / CAS EP functions the plan cache saw
registered (INSERT INTO EP.sasepv5, every call however fast) against how
many were traced. Click a row for the EP calls. EP calls are kept in the local
history whatever their duration, so a lower trace threshold shows the fast ones.
What explains the ~5.2 s, as far as the data shows (Oct 2026, read-only). Measured on this cluster (trace, plan cache, local history):
It's a step, not a cost per row. The daily
_hello_worldsasepFunction job took 0.24 s on 2026-10-13 (plan cache) and 5.24–5.30 s on the days it was traced: a +5.0 s step. Across all traced EP calls (1 to 7,599 rows returned) time doesn't follow rows (r² ≈ 0).It's before the EP touches the data. In the slow job runs the EP's generated
CREATE TABLE … AS SELECT … sasepin …started 5.20–5.23 s after the sasepFunction call started; it and everything after took < 50 ms.SingleStore isn't working or queueing. The plan cache shows 5,255 ms execution time but 3 ms CPU and 0 ms queued for that call; all EP calls run in
default_pool(no concurrency limit); workload management has queued 0 queries since start-up on both aggregators.Concurrent calls share one wait. VA calls that started 3.6–4.1 s after others finished within 0.2 s of them (2026-10-12 06:46, 2026-10-14 12:13).
An EXPLAIN waited too. A SAS-issued
EXPLAIN EXTENDED CREATE RESULT TABLE … JOIN EP.h…_EP(…)(compiles, doesn't run) took 5.06 s in such a burst, so the wait can happen before execution.Most EP calls are fast and not traced. The plan cache saw 68 VA / CAS EP functions registered against 26 traced; with a 1 s trace threshold, the "77 % at 5.2 s" is a share of the slow calls only. Sub-second warm calls (0.24 s job, ~1.1 s VA calls running on their own) are the normal case.
Side findings: the
_hello_worldjob's generated statement fails every day withER_TABLE_EXISTS_ERROR(MyDB._hello_world_1exists) while the call reports success;EP.sasepv5holds 147 orphan registrations from March–May 2026 andEPkeeps a few old per-job functions.
Documented: SAS EP functions are SingleStore external functions AS COLLOCATED SERVICE '/opt/sas/sasep.sock' (SHOW CREATE FUNCTION); SingleStore talks to a
collocated service over a Unix socket with shared-memory buffers and doesn't
start or manage the service (CREATE EXTERNAL FUNCTION);
the EP is deployed on each leaf pod (SAS SpeedyStore admin
guide);
the trace keeps only queries over Duration_threshold_ms and traces DDL only
from 9.1 (Query History).
Nothing documented explains a fixed 5 s.
Hypotheses (to verify, not shown by the data): a constant +5.0 s matches the
Linux resolver's default timeout (timeout:5 in
resolv.conf); in
Kubernetes a lost A/AAAA lookup (the conntrack race)
costs exactly that. If the EP resolves a host name or opens a connection to
the aggregator when it's cold (the job definition is in EP.sasepv5, which the
EP may read back), every cold call pays 5 s and concurrent calls queue behind
the same step. Alternatively a 5 s poll / retry inside the EP, or the child
aggregator waiting for the new per-job function's DDL from the master
aggregator (not traced on 9.0).
What to raise with the SAS EP owners:
What does the EP do in the first ~5 s of a cold call? Their EP log on the leaf pods at e.g. 2026-10-14 12:35:16–12:35:21 (cluster time) shows it.
Does the EP connect back to SingleStore per call (host name, DNS, TLS, authentication), and is there a pool / keep-alive / idle timeout for its process or connections? Time
getent hosts <aggregator host>in a leaf pod and check/etc/resolv.conf(ndots,single-request-reopen).Why do concurrent calls finish together: is a step in the EP serialized (e.g. reading or registering jobs in
EP.sasepv5)?Cleanup of orphan rows in
EP.sasepv5and old functions inEP; and the failing_hello_worldhealth check (drop its output table or let it replace it).
To see the fast EP calls too, an admin can recreate the trace with a lower
threshold for a while (it's a cluster setting, not done by the Workspace):
DROP EVENT TRACE Query_completion; CREATE EVENT TRACE Query_completion WITH (Query_text = on, Duration_threshold_ms = 100, Trace_all_failed_executions = on); and back to 1000 afterwards (not 0: it costs performance).
SAS-side options worth knowing (they change the transfer, not the fixed
wait): aggregatePushdown=true, epDatabase / udfDatabase on the
SingleStore caslib (SAS Communities),
NUMREADNODES for parallel CAS reads (SAS blog),
and WHERE= / KEEP= on the input of in-database DATA steps. Fewer, larger EP
calls pay the wait fewer times: combine small DATA steps; in VA, fewer objects
or precomputed formatted / calculated columns (to verify with SAS which VA
items need EP).
Usage tab. Ranks tables and users over 24 h, 7, 30 or 90 days, or everything stored.
Most used tables: executions and time from the plan cache (every run of every statement naming the table, however short, copied locally on each refresh and sampled every 10 minutes), next to traced runs from the query history, with distinct statements, last use, users and source. Table names are read from the SQL (FROM / JOIN / INTO / UPDATE,
db.tableor resolved against the statement's database). Click a table to list its statements.Most active users: queries, total and average time, longest, failures, databases, distinct statements and last activity, from the traced runs (the plan cache records no user). Click a user to see their queries.
Ask Claude answers right in the panel: like the SQL Editor's assistant, Claude Code runs in the background with read-only database access, gets the query, the findings, the plan and the table definitions, and can check things itself (row counts, cardinality). This also works in the desktop window and the browser. Only without Claude Code installed does it fall back to the Claude chat.
The Advisor tab (also the query_advisor_report tool) looks at the whole
history instead of one query. It EXPLAINs every distinct query (about 5
seconds for a few hundred) to see which columns each one filters, joins and
groups on, weights them by how long those queries ran, and suggests per table:
a SORT KEY on the columns most query time filters on, so whole segments are skipped;
a SHARD KEY on the join / group-by columns when data is reshuffled or broadcast. Only columns with enough distinct values qualify (checked against the optimizer's statistics), so it never suggests a key that would skew the partitions;
REFERENCE tables for small tables that get broadcast;
indexes for filtered rowstore tables, and ANALYZE for missing statistics.
Keys can't be changed in place, so each suggestion comes with statements that
build a copy with the new keys from the table's own definition
(CREATE TABLE … ; INSERT … SELECT) and, commented out, swap the names. A
Workload card lists queries returning millions of rows, large SELECT *
queries and the most frequent errors.
Source column
The Queries tab guesses where a statement came from, from its SQL:
SAS CAS: contains
binary_serializationorPARALLELISM_LEVEL="SEGMENT"(SAS SpeedyStore / CAS loading or pushing down through the cluster);SAS in-database: reads or writes tables named
_dm…,_flw…orSASTMP…(SAS work tables created in the database);SAS EP: calls the SAS Embedded Process (
sasepFunction(…),EP.sasep…);empty otherwise.
It's a heuristic, shown as "probably" in the detail panel, and a filter (Source: All / SAS CAS / SAS in-database / SAS EP / Other).
Trends
The cluster's query history is a ring buffer: older runs drop out. The server
keeps a summary of every traced run in a local SQLite file,
~/.singlestore-mcp/query_history.db: when it finished, how long it ran, user,
database, success / error code, type, rows, and its query shape (the SQL
with literals replaced, identified by its first 400 characters) with a short
sample. Nothing else is copied. It's updated whenever the history list loads
and on every Alerts check, and only reads events newer than the last copy, so
it's cheap. Each row records which cluster (host:port) it came from, and the
Trends tab only shows the active connection's cluster.
The Trends tab shows, per day (7 days, 30 days, 90 days, 1 year) or per hour for the last 48 hours:
the number of queries, the total runtime, failures, and the p95 duration (bars and a line, hover for the values). Click a bar to list the queries behind it, slowest first (on the Failures chart, only the failed ones). Click a query to open it in the Queries tab with its full SQL, tuning recommendations and Ask Claude, as long as the cluster's history still has it; older runs show the start of their SQL;
Slower than before: query shapes whose median duration in the last 7 days is at least 1.5× and 1 s more than in the 7 days before, with the run counts of both weeks;
New heavy queries: shapes first seen in the last 7 days with more than a minute of runtime in total.
Click a shape to see its runs in the Queries tab (as long as the cluster's
history still has them). Only queries the cluster traced are counted, i.e.
those over the event trace's Duration_threshold_ms (1 s in the setup above).
Before/after check
When the Advisor suggests a new SORT KEY, SHARD KEY or a REFERENCE
table, it builds a copy of the table (e.g. cars_big_240_sorted). Once you've
built it, Compare with new table checks whether it actually helps:
Accept or change the new table's name and press Find queries. The app checks that the table exists (otherwise it says to build it first), then picks the heaviest read-only query shapes (
SELECT/WITHonly; neverINSERT,UPDATE,DELETE, DDL orSELECT … INTO) from the history that read the table, and shows each one with the table name replaced (qualified and unqualified, with or without backticks; string literals, comments and other tables' columns are left alone). Nothing runs yet.Pick the queries, the number of runs per table (default 3) and the timeout per query (default 120 s), and press Run comparison. A confirmation says exactly what will run and roughly how long it takes.
Each query runs as
SELECT COUNT(*) AS n FROM (<query>) AS _q, so no rows are streamed to the client, alternating old / new table. The result per query: the old and new median (server time: wall time minus one network round trip), the speed-up, and whether both tables returned the same number of rows. A query over the timeout is cancelled withKILL QUERY(only after checking that its connection still runs this comparison's statement). Stop ends the comparison early.
Because of the COUNT(*) wrapper, the database may skip columns a query only
returns: the check times filtering, joining and grouping (what keys change),
not producing the output. Differences under about 10 % are noise. The
comparison's own statements are tagged and never appear in the history.
Alerts
While the server runs (inside Claude, or the desktop workspace), a background
thread checks the cluster every 60 seconds (configurable, minimum 15). Each
check runs a few read-only information_schema queries in parallel, takes
about a second, and is tagged so it never shows up
in the history, the Cluster Monitor or the alerts themselves. A check that
fails never affects the server; if every check fails, a "can't reach the
cluster" alert says so.
Rule (default) | Source | Alert |
Query running longer than 60 s |
| one alert per running query, active until it finishes |
Finished query slower than 300 s | new | one alert per query shape, with a count |
Failed queries | new | one per error code and query shape, with a count |
Pipelines |
| per pipeline (and error code) |
Node memory above 85 % of |
| per node, active while above |
Disk above 90 % |
| per node and mount, active while above |
Node not online |
| per node, active while not online |
Disk projected full within 14 days | the Cluster Monitor's History ( | per node, active while the projection holds |
Memory projected to reach | the same History | per node, active while the projection holds |
The two trend rules fit a straight line through the last 24 hours of History samples (one a minute while a server runs) for each node's data mount and memory. They only alert on a steady climb (at least 6 hours of samples, fit R² ≥ 0.5), so a one-off spike or a load that goes up and down doesn't count; the alert says how much it grew per day and when it is full at that rate (critical when that is within 2 days, or a third of the rule's days). Without History (the sampler off, or less than 6 hours stored) they find nothing.
Every rule can be switched off and its threshold changed in the view. An alert is kept once, with first / last seen and a count, so a long-running query or a full disk is one alert, not one a minute. Acknowledge one or all; an alert that happens again after being acknowledged comes back unacknowledged. Clear acknowledged / Clear all remove them; the list keeps the newest 300. On the first check against a cluster it starts from "now", so old failures in the history don't flood the list. Check now runs the checks at once.
Rules, settings and alerts are stored in ~/.singlestore-mcp/alerts.json
(shared by the server Claude starts and the desktop workspace; a change in one
is picked up by the other). SINGLESTORE_MCP_ALERTS=0 turns the background
checks off. The Cluster Monitor's metrics history has its own switch,
SINGLESTORE_MCP_METRICS=0.
The workspace rail shows the number of unacknowledged alerts as a red badge (it reads the server's in-memory state every 30 seconds; no cluster queries). With Notify me on, the workspace also shows a browser notification for new alerts, after you allow notifications in the browser (it asks on your next click in the workspace). That works in the browser and the desktop window; in the Claude app the badge is the signal.
Workload
A workload is a name, a default database, settings and a list of SQL
statements, each with how often it runs a minute (or, with pacing "as fast as
possible", a relative weight). Define one by hand, take the heaviest read-only
queries of the last 24 hours with From history, or send a single query
over from the Query History panel's Add to workload button. Statements
may use placeholders filled in per execution: {{int:1:1000}},
{{float:0:1}}, {{pick:a|b|c}}, {{date:2024-01-01:2024-12-31}} (quote
strings yourself, e.g. '{{pick:US|EU}}').
Settings: connections (parallel workers, each its own connection, opened
once so connecting isn't measured), duration, a per-statement timeout
(the statement is cancelled with KILL QUERY after it), arrivals (evenly
spaced, or random/Poisson for bursts like real users at the same average
rate), read all rows (off measures just the execute time, not the cost of
reading the result back), allow writes (off by default — statements other
than SELECT / WITH run repeatedly, so point them at a test table) and
trace every query during the run (needs the ALTER EVENT TRACE
permission; temporarily sets the cluster's Query_completion trace to
Duration_threshold_ms = 0 so every execution lands in Query History, then
restores the previous setting — tracing costs cluster performance, so compare
traced runs only with traced runs).
Only one workload runs at a time. While it runs, the view shows live KPIs
(executions, per second, p50 / p95 / p99, errors, skipped releases when the
cluster — or the connection count — can't keep up with the rate) and
per-second throughput and latency charts; Stop cancels the statements
running now. A run lasts its full duration (statements are released until
the end, and the per-second rates are over the whole duration, or the time
until Stop); statements still running at the end finish ("finishing…") and
count. Every statement is tagged /* workload:<name> stmt:<id> */, so
finished executions show up in Query History with the source "Workload:
<name>", and the tag is stable across runs so query plans are reused.
Saved runs lists every past run of the selected workload; Compare picks two finished runs (e.g. a baseline and one after a new sort key, shard key or index) and shows, per statement, p50 / p95 before and after with the percent change, throughput, errors, and whether the SQL or the row counts changed between the runs — changes of 5% or more are coloured, smaller differences are usually noise. Tune on a statement reuses the same EXPLAIN and table-design recommendations as Query History's tuning panel.
Claude in Workload. The Claude button opens a chat panel on the right,
like the SQL Editor's: the in-app assistant answers
(or, as there, the Claude chat). Each question carries the selected workload
(settings and every statement), the shown run's per-statement p50 / p95 /
errors / rows, and the definitions of the tables the statements read (keys,
row counts, distinct values per column). Ask for variants of a statement,
realistic parameter spread with the placeholders, heavier or lighter versions
or a realistic mix of rates; Claude may query the database read-only to find
real values, never runs writes, and puts each statement in its own SQL block,
optionally with -- name: and -- per_minute: lines. Every block has Add to
workload (a new statement, 60 a minute unless the block says otherwise),
Replace statement N (pick which; the last statement you clicked by
default), Test (runs it once, read-only, and shows rows and time) and
Copy. Changes are unsaved until Save / Save and run. Each workload
has its own conversation while the page is open.
From and to the SQL Editor. The SQL Editor's → Workload adds statements to a workload (see SQL Editor). The other way, Open in SQL Editor on a statement opens it in a new editor tab, in the statement's database. That tab remembers the workload and statement (in its autosaved draft, so also after a restart) and shows Update in workload, which writes the tab's SQL (the selection, else the whole tab when it holds one statement, else the statement at the cursor) back to the statement and saves the workload; an open Workload view shows the new SQL right away and keeps its own unsaved changes. If the workload or statement is gone (deleted, renamed, or the statement was never saved), the tab says so and offers → Workload instead. Query History's Add to workload works as before.
Workloads and their runs are saved in ~/.singlestore-mcp/workloads/
(workloads.json, and one JSON file per run under runs/). The model-visible
tools workload_define, workload_run, workload_status, workload_stop,
workload_list and workload_compare work the same way without opening the
app, so Claude can define, run, watch and compare a workload from the chat.
Security
Who can do what, and (for users with the right privileges) a GUI to change it. Claude's tools only read; every change is made in the view, shows the exact SQL first and runs only after you confirm it.
Users: every user with type, lock status (and the failed-login lockout setting), password age and expiry, default resource pool, groups, connections and flags (ALL / SUPER on
*.*, grant option, host'%', password never expires, locked, TLS required, unused, i.e. no traced query in the local Query History store for N days). Click a user for their effective privileges with the reason for each (direct, or via role ← group),SHOW GRANTS(password hash hidden) and an Account block: status,REQUIRE SSL/NONE, the failed-login lockout, and (for your own account) whether this app's connection uses TLS.Roles & groups: the user → group → role → privileges chain and Who can access … for a database or table.
Resource pools: limits, live running and queued queries per pool, the workload manager queue with the limit each query waits for, and who uses which pool.
Audit log: the audit settings (
SHOW VARIABLES LIKE 'audit%') and, when audit logging is off, the steps an admin takes to turn it on (see Audit log).
Changes (v2). Create / drop users (the password is typed in a masked field),
GRANT / REVOKE privileges on *.*, a database or a table (picker), revoke all,
create / drop roles and groups, grant a role to a group and a group to a user,
create / change / drop resource pools, set a user's default pool and grant pool
usage, and per user: change password, lock / unlock, the failed-login
lockout, REQUIRE SSL / NONE and grant columns through a view (see
Passwords, locks, TLS and column grants).
Each change:
Preview SQL shows the exact statements (a password always as
'********') with warnings and blockers.You confirm with a tick, or by typing the name for a DROP, "revoke all", your own account, an admin account or anything that takes admin rights away.
The server builds the statements again from the cluster as it is now, runs them one by one (stopping at the first error), shows the result and refreshes the view.
Blocked outright: dropping the user you're connected as, and any change that
would leave no admin (a user with CREATE USER or SUPER and the grant option
on *.*). Warned: removing your own or another admin's rights, open
connections of a dropped user (DROP USER doesn't close them), privileges
that aren't granted directly, pools that are a user's default (SingleStore
refuses to drop those), CPU limits summing over 100 %. When you lack the
privilege for a kind of change (CREATE USER, the grant option, ALTER USER,
CREATE POOL / DROP POOL, per the SingleStore permissions matrix) the
buttons still open the preview, but Run is off with the reason: you can
make a SQL script of the change instead (below).
SQL script instead of Run – for customers where a DBA reviews and runs security changes. Under every preview, next to Run:
Copy SQL, Open in SQL Editor (a new editor tab with the script; it isn't run) and Save as .sql… (the file browser with This computer / SAS Content / SAS Server, suggested name
security-<date>-<time>-<what>.sql; an existing file is only replaced after Replace it).Add to script collects the change in the SQL script basket under the panel: reorder (↑ ↓), remove (✕), Show script, then Copy SQL / Open in SQL Editor / Save as .sql… for all of them at once. The basket lasts for the browser session (also a page reload). A change can use what earlier changes in the basket create (e.g. grant a new role to a new group): the pickers list those objects "(in script)", and such a change can only go into the script.
The script has a header (connection name and host, the connected user, date and
time, one line per change), the statements in a safe order (creates – pools,
roles, groups, users – then grants and other changes, then revokes, then drops;
Keep my order turns that off) and each change's warnings as -- WARNING:
comments. The statements are the ones the preview shows and Run would execute,
built by the same plan builder from the cluster as it is now, with each change
checked as if the earlier ones had run (names, existing objects, lock-out / last
admin). Making a script runs nothing and needs none of the change privileges
(the header notes which privileges whoever runs it needs). No password is
ever in a script: CREATE USER and a password change get
'<set password>' and a -- WARNING: to replace it (the password field is never sent for a script).
SingleStore 9.0 also accepts CREATE USER without IDENTIFIED BY, but that
makes a user without a password, so it isn't used.
The password is sent once, as a bound parameter of CREATE USER (or the
password change), and is never
shown, logged, returned or stored (not in the plan, the model context or the
local Query History store, which skips the app's own /* s2-… */ statements).
Found on 9.0.40 and handled: REVOKE ALL PRIVILEGES, GRANT OPTION needs every
privilege the revoker could revoke (an admin without SUPER gets "Access
denied"), so "revoke all" revokes what the grantee holds, one statement per
object; a pool limit can't be set back to "none" (except MAX_CONCURRENCY = 0);
a user's default pool can't be cleared, only set to another pool (e.g.
default_pool).
Passwords, locks, TLS and column grants
Buttons in a user's Account block (and options in + New user). Checked in
the SingleStore 9.0 docs and tried on 9.0.40 with zz_test_ users:
Change password – two masked fields that must match; sent once as a bound parameter of
ALTER USER 'u'@'h' IDENTIFIED BY …,'********'in the preview,'<set password>'in a script, never in results, logs or history. Your own password can always be changed: withoutALTER USERit usesSET PASSWORD FOR … = PASSWORD(…)(9.0.40 refusesALTER USERon yourself then). For your own account you type your name to confirm, and if the active saved connection signs in as you, a tick saves the new password for that connection (OS credential store) after the change succeeded. The environment-variables connection, a URL or a token login can't be updated that way (the panel says what to do). Open connections keep working; a lock stays.Lock… / Unlock… –
ALTER USER … ACCOUNT LOCK / UNLOCK. Status frominformation_schema.USERS.ACCOUNT_STATUS(LOCKED/OPEN). Refused: locking yourself, or the last admin that isn't locked. Unlock also clears a lockout after too many failed logins. A locked login gets error 2449; open connections keep working; a cluster restart clears every lock (docs).Failed-login lockout… –
ALTER USER … SET FAILED_LOGIN_ATTEMPTS = n PASSWORD_LOCK_TIME = s(seconds). Both above 0 turns it on, both 0 off; SingleStore refuses one without the other (error 2451).+ New usercan set it too (CREATE USER … WITH … FAILED_LOGIN_ATTEMPTS = n PASSWORD_LOCK_TIME = s).Require TLS (SSL)… / Allow non-TLS logins… –
ALTER USER … REQUIRE SSL / NONE(+ New user: optionalREQUIRE). Read fromUSER_PRIVILEGES(PRIVILEGE_TYPE = 'SSL') andSHOW GRANTS:USERShas no column for it. A non-TLS login then gets error 2455. Requiring SSL for your own account when this app's connection doesn't use TLS (Ssl_cipherof the session) shows a lock-out risk warning and needs the typed name.X509/SUBJECTaren't offered.Grant columns (view)… – 9.0 has no column-level privileges: the GRANT reference has only
*.*,db.*anddb.table("Table privileges apply to all columns"), and on 9.0.40GRANT SELECT (c1, c2) ON db.tis accepted but grants SELECT on the whole table (every column readable;REVOKE SELECT (c)likewise revokes the whole table). So the form picks a table and columns and previews two statements:CREATE VIEW db.v AS SELECT c1, c2 FROM db.tandGRANT SELECT ON db.v TO …. Views run as their creator (DEFINER), so the grantee needs nothing on the table; the plan warns when the grantee already hasSELECTon the table, the database or*.*(then the restriction doesn't hold). Remove it later with Revoke on the view orDROP VIEW.
Docs: ALTER USER, CREATE USER, SET PASSWORD, GRANT, CREATE VIEW.
Audit log
SingleStore's audit log (Enterprise edition) is files on each node, not a
table: there is no information_schema view of it. On this cluster it is off
(auditlog_level = OFF, files would go to /var/lib/memsql/instance/auditlogs).
Turn it on (an admin, outside this app; the variables only take effect when a node starts): with SingleStore Tools
sdb-admin update-config --all --key "auditlog_level" --value "ADMIN-ONLY"(plusauditlog_retention_period, days), thensdb-admin restart-node --all; with the Kubernetes Operator (this cluster's node names suggest it), setauditlog_level: "ADMIN-ONLY"underspec.globalVariablesof theMemsqlClusterresource andkubectl apply. Check withSHOW GLOBAL VARIABLES LIKE 'audit%';.Levels:
LOGINS-ONLY,ADMIN-ONLY(+ DDL, GRANT/REVOKE, CREATE USER),WRITES-ONLY(+ DML),ALL-QUERIES(+ SELECT),*-PLAINTEXT(literal query text),ALL-RESULTS, each with an-INCLUDING-PARSE-FAILSvariant (which can log passwords typed in invalid statements). Passwords in valid statements are left out.Files: CSV,
auditlog_<host>-<port>_<date>_<time>.loginauditlogsdir, rotated byauditlog_rotation_size(128 MB) andauditlog_rotation_time(1 h), removed byauditlog_retention_period(days) orauditlog_retention_size(MB); 0 = keep forever. Query lines: id, time, time zone, host:port, node type, aggregator id, thread id, user, database, correlation id, query hash, query; login lines carry user, remote host, auth type, status, TLS cipher and app name.Reading it: through SQL only by loading the files (a pipeline or
LOAD DATA), which needsFILE READand file-system access on the nodes;FSpipelines aren't supported with the Kubernetes Operator. The practical route is a log collector (Fluent Bit / Filebeat on each pod'sauditlogsdir) into a SIEM or a SingleStore table, which the Security view could then show (filter by user, time, statement type).
Sources: Configure Audit Logging, Audit Logging Levels, Audit Log File Format, Operator: Configure Audit Logging.
Without admin rights it shows only your own groups, roles and grants. Ask
Claude "who can access database EP?", "what can user Hans do?" or "why are
queries queued?" (tools security, who_can_access, user_privileges,
resource_pool_status).
Config
Every engine variable with its value on each node. Search, filter by "changed
from default", "differs between nodes", category, sync / non-sync and runtime
vs startup only, and export as CSV. Click a variable for its description, docs
link and the SET GLOBAL statement to copy (never run). Defaults and
descriptions come from the SingleStore docs for your version, downloaded once
and kept in ~/.singlestore-mcp for 7 days; without internet access defaults
show as unknown. Ask Claude "which settings are changed from default?" (tool
cluster_config).
Claude in the apps
The chat panels in the SQL Editor, the Notebook and Workload are answered by the server itself, by running Claude Code headless with your own Claude login: no API key, no Send click in the chat, and it also works in the browser and desktop window.
What it can do: read the schema and run read-only queries (through its own MCP server with only
list_databases,list_tables,describe_tableandread_query). It has no shell or file access and can't change data: it gives you statements to review and run.Speed: Fast (Haiku), Balanced (Sonnet, medium effort; default) or Thorough (Opus, high effort).
Knows SingleStore: every question includes the SingleStore SQL skill (
SKILL.md), key learnings such as case-sensitive names and procedure syntax. Add to it as you find pitfalls.Knows SAS: in a SQL Editor tab that runs PROC SQL, FedSQL or FedSQL in CAS, the question also carries the tab's library / caslib and known columns and, once per session and language, that language's SAS guide (see Ask Claude in a SAS tab).
Quick answers: each editor / notebook keeps one Claude process running (started when you open the panel), so questions don't wait for Claude Code to start; follow-ups keep the conversation. Idle processes close after 10 minutes. Progress and a Stop button show while it works.
Needs Claude Code installed and logged in (
claude, then/login, once). It uses your Claude plan like any other Claude Code session.
Browser and desktop window
↗ Open in browser reopens the current view full-window in your browser,
for when the chat column is too narrow. Claude also posts this link under each
app, and the browser_link tool makes one on request. Links work on this
machine only (127.0.0.1, with a secret token in every link).
Restarts don't break an open tab. The link's port and token are kept in
~/.singlestore-mcp/browser/ and reused by the next server, which listens on
them again right at start: after restart_server, a crash restart or a
restart of Claude, the tab's next call reaches the new server. Meanwhile the
page shows Reconnecting to the SingleStore MCP server…, holds the app's
calls and retries (also at once when the laptop wakes up or the network comes
back); Cluster Monitor, Query History and alerts then go on refreshing by
themselves. A call that changes something and was cut off mid-way isn't sent
twice: the app says it may or may not have run.
If the server doesn't come back within 60 s (SINGLESTORE_MCP_BROWSER_RECONNECT),
or the token is refused, the tab shows Session ended instead of the app
(all polling stops) — reopen the app from Claude or the desktop shortcut, or
press Try again once a server runs again. SQL Editor text that couldn't be
autosaved meanwhile is kept in that browser tab, can be copied from the
Session ended page, and is saved to its editor tab as soon as the page
reaches a server again. Database errors (VPN down, cluster unreachable) are
not this: see the next section.
After a network break (VPN, sleep, Wi-Fi)
The server recovers by itself when the VPN drops or reconnects (also on another gateway with a new address, e.g. 172.29.x → 172.16.x), the laptop wakes up or Wi-Fi changes — no restart needed. While SingleStore or SAS Viya can't be reached, the Workspace shows Connection to SingleStore lost (since 14:02) – retrying… at the bottom (hover: the error; Retry now checks at once); a tool call says so readably ("… reconnects by itself as soon as the cluster can be reached again"). Once the network is back the line goes away within a few seconds, a Reconnected to SingleStore message shows, the views reload what failed meanwhile (Cluster Monitor, Query History and alerts were polling anyway; the Schema Explorer reloads its failed lists) and you just carry on.
What happens underneath (netguard.py):
Dead connections are noticed in seconds, not hours. Every connection to the cluster (pool, standby, notebook kernels, Compare / Workload runs) and to Viya has a short TCP keepalive (10 s idle, then 3 probes 5 s apart:
SINGLESTORE_MCP_TCP_KEEPALIVE) instead of Windows' two hours, and connecting gives up after 10 s (a whole cluster login after 20 s).A VPN that moved to another local address: a watcher (every 2 s) sees that the route to the cluster / Viya now leaves from another address and closes the connections opened from the old one at once — a query waiting on one is read again on a fresh connection (a write that may have run is never sent twice).
After sleep (the clock jumped) or any failure, idle pooled connections are checked with a ping (at most 3 s) before they're used again, and replaced if dead. Kept-alive Viya connections are replaced instead of reused.
A call never waits on a hung connection for long: a full pool waits at most 2 minutes (
SINGLESTORE_MCP_POOL_WAIT) and says why.SAS: a Compute or CAS session Viya ended while the network was away is started again with the automatic S2 library and the startup code; the next run's log and the Workspace say once The SAS session had ended … and was started again (WORK tables from before are gone). The SAS pre-warm / keep-alive retries 10 s after a failed check (not after its 4 minutes), and at once when the page comes back online or Viya answers again; a token renewal that fails because the network is away says so and keeps the sign-in (not "sign in again"); proxy vs. direct is chosen again after a failure.
While a service is down the server checks it again in the background (every few seconds for two minutes, then every 30 s), so it's found back even when nothing else asks. The MCP side never restarts the server over network errors.
Check it yourself: open the Workspace, run a query, disconnect the VPN for a
minute (or close the laptop lid), and reconnect. The bottom line appears while
it's away and goes by itself; run the query again — it works without
restart_server. A query running at the moment the VPN switches gateway is
retried on a fresh connection.
Who owns which address: every MCP client connection (Claude Desktop and
Claude Code each start one server) holds a slot (a lock file in that folder)
for as long as it runs, and its servers always use that slot's address; a
second client takes the next free slot, so two servers never share a port.
When Claude restarts, its new server takes the lowest free slot again. If
another program has taken the port, the server picks a new one (and keeps
that). The standalone workspace keeps its own address in workspace.json.
Connections → Reset browser links gives the server a new token: every open
tab and earlier link then ends (restarts never change it).
The workspace also runs without Claude, in its own window:
uv run python scripts/make_shortcut.py --database SASDPcreates a SingleStore Workspace desktop shortcut. It starts the app server
on 127.0.0.1 and opens the workspace in an Edge app window (--browser for
your default browser). Clicking it again opens another window; after a code
update it replaces the running server; it stops 5 minutes after the last
window closes. It needs the SINGLESTORE_* settings as user environment
variables. Full guide, including installing on a new machine:
Using the workspace without Claude.
In the browser and desktop window, actions such as Start / Stop pipeline don't go through Claude's approval prompt (the apps' own confirmations still apply), and chat answers come from the in-app assistant.
Settings
All optional, as environment variables of the MCP server:
Variable | Default | What it does |
|
| Folder the file browser starts in |
| your user folder | Extra folders Open / Save may use (separated by |
|
| Where the notebook environment and app state live |
| (own environment) | Use an existing Python for notebooks instead |
|
| Max rows a notebook SQL cell fetches |
| GitHub raw hosts | Image hosts allowed in notebook text cells inside Claude |
|
| Claude Code executable for the in-app assistant |
|
| The Balanced assistant profile |
|
| Seconds before an answer is abandoned |
|
| Database connections in the server's pool |
|
| Seconds a call waits for a free pooled connection before it gives up with a readable error |
|
| TCP keepalive of every cluster / Viya connection: idle seconds, seconds between probes, probes ( |
|
| Seconds a TCP connect to the cluster or Viya may take |
|
| Seconds a whole cluster login (TCP, TLS, sign-in, session settings) may take |
|
| Seconds the ping that checks an idle pooled connection after sleep / a network change may take |
|
| A pooled connection idle this long is pinged before use |
| off | Run without the restart relay |
| off | Don't keep a pre-loaded standby process for fast restarts |
|
| Seconds after a start before the standby is prepared |
|
| Database connections the standby opens ahead for the server after |
|
| Seconds an open browser tab keeps trying to reach a restarting server before it shows Session ended |
|
| Seconds a new server waits for the previous one to free the browser port |
| on |
|
|
| Seconds between metrics samples (15–300) |
|
| Days of metrics history kept (1–90) |
|
| Seconds after a server start before the first metrics sample (the Cluster Monitor's CPU baseline is read after at most 8 s) |
| on |
|
| on |
|
~/.singlestore-mcp is used rather than %LOCALAPPDATA% because Windows gives
the Claude desktop app a private copy of that folder, so Claude and the desktop
window would otherwise use different notebook environments.
How the apps work (for developers)
The model gets a compact text summary of each app's result (e.g. the first 20 rows); the full data goes to the app only. Helper tools the apps call for refreshes and drill-downs are app-only, so they don't clutter the model's tool list.
Layout:
src/singlestore_mcp/apps/has one<name>.py(tools) +<name>.html(UI) per app, sharedshared.js/shared.css, and vendored libraries invendor/(the official ext-apps client and a CodeMirror bundle built byscripts/build_codemirror), inlined so the apps need no internet access.The workspace is a small MCP Apps host for its views: each view runs in its own sandboxed iframe (loaded through a tool call, so hosts can't serve a stale page after a restart), and the workspace relays its tool calls, messages and model context to the real host. Only the visible view loads on open; its page is fetched while the host still runs
sql_editor, comes without the shared head (the ~0.45 MB ext-apps bundle,shared.js,shared.css; the workspace puts its own copy back), and a page the workspace already has (another SQL tab or notebook) is only revalidated. Vendor blocks (CodeMirror ~0.5 MB, the function list, the charts) are markeddata-s2-vendor/data-s2-hash; the workspace keeps the ones it got and asksapp_pagefor later pages without them (vendors), so opening the Notebook after the SQL Editor doesn't bring CodeMirror a second time. Standalone pages (resources/read, the browser view) are whole.Notebook kernels run in the notebook environment through
notebook_bridge.py, driven bynotebook_kernel.py.Every page carries a build stamp (hover the Notebook title) to spot an outdated page.
Dev host: scripts/dev_host.py is a local stand-in for Claude. It starts
the real server over stdio, renders an app and speaks the MCP Apps protocol
to it, against your real cluster.
uv run python scripts/dev_host.py --port 8765Open http://127.0.0.1:8765, pick a tool, give JSON arguments, Run. Each run
starts a fresh server, so Python and HTML edits show up on reload. The right
panel shows the protocol log and anything the app sends to the chat. Add
&debug=1 to the URL to give the iframe same-origin access (appDoc() in
the console returns the app's document) for scripted testing.
Using the workspace without Claude
The SingleStore Workspace also runs as a standalone desktop app: a small local web server plus a browser window, talking directly to SingleStore. No Claude subscription, Claude app or MCP client is needed for it. Only the Claude chat panels need Claude.
Quick install (Windows, one command)
Open PowerShell (or press Win+R) and run:
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/jonasliesas/singlestore-mcp-server/master/install.ps1 | iex"No administrator rights needed. install.ps1:
installs uv, which brings Python 3.12;
downloads the program to
%USERPROFILE%\singlestore-workspace(with git if available, otherwise as a ZIP);installs the dependencies;
creates a SingleStore Workspace shortcut on the desktop and in the Start menu;
opens the workspace. On the first start it opens on Connections, where you add your cluster (password, JWT, Helios SSO or Microsoft Entra ID).
Run the same command again to update. Options (pass them with
& ([scriptblock]::Create((irm <url>))) -Notebook -Database SASDP, or run a
downloaded install.ps1 with them):
Option | What it does |
| database the shortcut opens in |
| also install the notebook's Python environment now (about 150 MB) |
| install somewhere else |
| install from a local copy of the project (share, USB stick), not from GitHub |
| also register the MCP server and skills with Claude Code, if installed |
| don't open the workspace at the end |
| remove the program and shortcuts (keeps connections, files and notebooks) |
The manual steps below do the same by hand.
What works and what doesn't
Feature | Without Claude |
SQL Editor: autocomplete, run SQL, results, history, CSV export | ✅ |
SQL files: Open / Save / Save as, file browser | ✅ |
SQL files on SAS Viya (SAS Content, SAS Server) | ✅ with a signed-in SAS Viya connection |
Notebook: SQL, Python and text cells, charts, | ✅ |
Notebook Python environment and the Packages panel | ✅ (installed with |
Schema Explorer, Pipeline Monitor (incl. Start / Stop / Test), Cluster Monitor, Query Grid | ✅ |
Database list refresh, full-window layout | ✅ |
Claude chat panels (SQL Editor, Notebook) | ❌ need Claude Code logged in to a Claude account; without it the panel shows a message and nothing else is affected |
Ask Claude buttons (Schema Explorer, Pipeline Monitor) | ❌ hand the question to the Claude chat, which the standalone window doesn't have; the button says so |
Slash commands, asking Claude in a chat | ❌ need a Claude client |
Other MCP clients (e.g. VS Code with GitHub Copilot) can still use the server's tools, but show plain text results instead of the apps.
What you need
Windows with Microsoft Edge (for the app window). On macOS / Linux the standalone app also works with
--browser, but the desktop shortcut script is Windows-only.uv, which installs Python 3.12 and all dependencies for you. No separate Python installation is needed.
Git, or download the repository as a ZIP from GitHub.
Network access to your SingleStore cluster (default port 3306) and, for the first notebook setup, to the Python package index (PyPI).
1. Install
git clone https://github.com/jonasliesas/singlestore-mcp-server.gitcd singlestore-mcp-serveruv syncuv sync creates .venv in the project folder with Python 3.12 and the
server's dependencies.
2. Connection settings
The app reads the same settings as the MCP server, from user environment variables (Windows: Settings → System → About → Advanced system settings → Environment Variables → User variables):
Variable | Example | Required |
|
| yes (or |
|
| yes |
| your password | yes |
|
| no (default 3306) |
|
| no: default database |
|
| no: only if your cluster has no TLS |
|
| no: instead of the separate variables |
Enter the password in the Environment Variables dialog rather than with
setx in a terminal, so it doesn't end up in your shell history. Windows
picks up new variables in newly started programs, so set them before creating
the shortcut, or sign out and in again afterwards.
3. Create the desktop shortcut
uv run python scripts/make_shortcut.py --database SASDPThis creates a SingleStore Workspace shortcut with a database icon on your
desktop. To find it from the Start menu too, copy it to
%APPDATA%\Microsoft\Windows\Start Menu\Programs. Options:
--database SASDP: database to start in--view notebook: open on another view (sql,notebook,schema,pipelines,cluster)--name "SingleStore Notebook": shortcut name (make several shortcuts for different databases or views)
Without a shortcut, start it from the project folder with
.venv\Scripts\pythonw.exe -m singlestore_mcp.workspace_app --database SASDP
(add --browser to use your default browser instead of an Edge window).
4. First start
Double-click the shortcut. A window opens with the workspace, usually on the SQL view. The first start takes a few seconds; the server runs in the background without a console window.
Open the Notebook view. The first time, it offers to Install the notebook's Python environment (about 150 MB, a minute or two). Later starts skip this.
Pick your database in the dropdowns and start working.
Everything you create is stored on your machine: SQL files and notebooks in
Documents\SingleStore SQL (or wherever you save them), the notebook
environment in ~/.singlestore-mcp.
Day to day
Several windows: clicking the shortcut again while it runs opens another window on the same server (fast; notebooks and kernels are shared).
Stopping: close the windows. The server stops by itself 5 minutes after the last window closes, along with any notebook kernels.
Updating: run
git pullanduv syncin the project folder. The next click on the shortcut notices the new code and restarts the server (this also restarts notebook kernels).Packages for notebooks: use the notebook's Packages panel or
%pip install …in a cell; restart the kernel (↻) afterwards.
Troubleshooting
Symptom | What to do |
Nothing happens on double-click | Run the command from step 3 with |
"Couldn't connect" / errors in every view | Check the |
Window shows "Not found" | An old server is still running from an earlier version; close all windows, wait a few seconds and click the shortcut again. |
Notebook says the environment is missing | Click Install in the notebook; it needs |
A new package isn't found in a notebook | Restart the kernel (↻); check |
Model downloads (Hugging Face) hang | Already handled: downloads use plain HTTPS. If you're behind a proxy, set |
Security notes
The server listens on
127.0.0.1only, and every window uses a secret link; other machines and other web sites can't use it.It uses your SingleStore user's permissions. Statements that change data ask for confirmation in the SQL Editor and in SQL cells; Python cells and
%sqlrun as written, as in Jupyter. Changes to users, grants, roles, groups and resource pools are made only in the Security view, after a preview and your confirmation (see Security).Notebook code runs with your Windows user rights, like any local Jupyter.
Studio on a server (pilot)
SAS SpeedyStore Studio can also run on a server for several colleagues, without Claude: a small hub signs users in
with their SAS user on SAS Logon (Viya), starts one Studio per user with its own folder, and proxies it behind
https://<studio host>/studio/. SAS work runs as the signed-in user (their Viya token is pre-loaded); each user adds
their own SingleStore connection. Notebooks and Ask Claude are off in this first step.
.\scripts\studio-hub-local.ps1 # try it on this PC: http://127.0.0.1:8800/Container image, Kubernetes manifests and every setting: deploy/README.md; what the Viya and Kubernetes admins do (OAuth client in SAS Logon, ingress/TLS, storage, network, secrets): deploy/ADMIN-GUIDE.md.
Setup
Uses uv to manage the Python environment,
pinned to Python 3.12 via .python-version:
cd singlestore-mcp-server
uv syncThis creates .venv/ and installs everything from uv.lock.
Then tell the server how to reach your cluster. Recommended: register the
server without credentials and add the connection in the Connections
window (connections_window, or Connections in the Workspace). The password
then goes to your OS credential store (Windows Credential Manager, macOS
Keychain, Secret Service on Linux), never into a config file. The installer
opens Connections by itself when there is no connection yet.
The older way, SINGLESTORE_* environment variables in the MCP config, still
works: they show up as the read-only connection "Environment variables". The
password then sits in the config file in plain text; see
Moving the password out of the config.
Supported variables (see .env.example):
Variable | Required | Notes |
| yes* | |
| no | default |
| no | default |
| no | |
| no | default database for queries |
| no | set |
| yes* | alternative to the above: |
* set either SINGLESTORE_HOST or SINGLESTORE_URL.
How you wire these in depends on which MCP client you're using — the two below are unrelated mechanisms, use whichever matches your setup.
Claude Code (in VS Code, or the terminal)
There are two ways to register the server with Claude Code — pick one. They're independent; you don't need both.
Option A: project-scoped, via .mcp.json (already done)
.mcp.json at the project root already registers the server,
scoped to this project only:
{
"mcpServers": {
"singlestore": {
"command": "uv",
"args": ["run", "--directory", ".", "singlestore-mcp-server"],
"env": {
"SINGLESTORE_HOST": "${SINGLESTORE_HOST}",
"SINGLESTORE_USER": "${SINGLESTORE_USER}",
"SINGLESTORE_PASSWORD": "${SINGLESTORE_PASSWORD}",
"SINGLESTORE_DATABASE": "${SINGLESTORE_DATABASE:-}",
"SINGLESTORE_SSL_DISABLED": "${SINGLESTORE_SSL_DISABLED:-false}"
}
}
}
}Claude Code doesn't have an interactive "prompt me for the secret" flow the
way VS Code Copilot Chat does. Instead, the ${VAR} syntax above is expanded
from your actual shell/OS environment when Claude Code starts, so the
value never has to live in this tracked file — set the real variables
(Windows: System Properties → Environment Variables, or
setx SINGLESTORE_PASSWORD hunter2, then restart the terminal/VS Code so it
inherits the change) and .mcp.json stays safe to commit as-is.
Once the env vars are set, open this folder in VS Code with the Claude
Code extension (or run claude from a terminal cd'd into this folder) and
the singlestore server connects automatically — there's no separate mode
toggle to flip. Because the registration lives in this folder's .mcp.json,
it's only picked up when Claude Code's working directory is this project;
opening a different folder won't see it.
Option B: user-scoped, via claude mcp add (available everywhere)
To make the server available from any project — not just when this folder is open — register it once at the user level instead, from a terminal, with no credentials (add the connection in the Connections window afterwards):
claude mcp add singlestore -s user -- uv run --no-sync --directory "C:\path\to\singlestore-mcp-server" singlestore-mcp-serverclaude mcp add -e SINGLESTORE_PASSWORD=… also works, but stores the password
in plain text in ~/.claude.json.
Either way
Run /mcp inside a Claude Code session to check the singlestore server's
connection status and see the tools it exposes. If you just registered it
(either option) in a session that's already running, its tools won't appear
until you restart that session — MCP servers are only loaded at startup.
Claude Desktop
Claude Desktop (the standalone app, not Claude Code) uses a different,
app-level config file — there's no per-project .mcp.json support and no
${VAR} expansion. Leave the credentials out of it and add the connection in
the Connections window.
Open the config file for your OS (create it if it doesn't exist yet — or in the Claude Desktop app, go to Settings → Developer → Edit Config, which creates and opens it for you):
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Add a
singlestoreentry tomcpServers, merging with whatever's already there rather than replacing the whole file:{ "mcpServers": { "singlestore": { "command": "uv", "args": [ "run", "--no-sync", "--directory", "C:\\path\\to\\singlestore-mcp-server", "singlestore-mcp-server" ] } } }Use an absolute path for
--directory(Desktop doesn't run this from the project folder the way VS Code does), and escape backslashes as\\on Windows. On macOS the path would look like/Users/you/singlestore-mcp-server.Quit Claude Desktop completely and reopen it — config changes only take effect on a full restart, not just closing the window.
Click the "Add files, connectors, and more" (+) control in the message box, open Connectors → Manage connectors, and confirm
singlestoreis listed and connected.
If you do put SINGLESTORE_* variables with a password in this file, it is
stored in plain text; treat it like any other credentials file. Logs for debugging a failed connection live in
%APPDATA%\Claude\logs\mcp-server-singlestore.log (Windows) or
~/Library/Logs/Claude/mcp-server-singlestore.log (macOS).
Moving the password out of the config
If your ~/.claude.json or claude_desktop_config.json still has
SINGLESTORE_PASSWORD in the singlestore entry, move it to the credential
store:
uv run --no-sync python -m singlestore_mcp.move_password # dry run: shows what it would do
uv run --no-sync python -m singlestore_mcp.move_password --apply # do it (quit Claude Desktop and Claude Code first)For every config entry with SingleStore credentials (Claude Code, Claude
Desktop including the Microsoft Store copy, and claude_desktop_config*.json
backups next to it) it uses the saved connection with the same host, port and
user, or saves a new one with the password in the credential store; makes it
the active connection if none is; and removes the SINGLESTORE_* connection
variables from the entry. It never prints the password, leaves ${…}
placeholders alone, and stops at an entry whose password differs from the one
already saved (fix that in Connections and run it again).
VS Code + GitHub Copilot Chat
If you're using Copilot Chat's own MCP support instead, .vscode/mcp.json
registers the server for that. Copilot Chat does support an interactive
prompt via an inputs block + ${input:<id>} placeholders (VS Code pops a
masked input box on first start and caches the value), which is the closest
equivalent to Claude Code's env-var approach above — see the comments in
that file. Switch Copilot Chat's mode dropdown to Agent for the
server's tools to show up; they're invisible in Ask/Edit mode.
Manual smoke test
SINGLESTORE_HOST=127.0.0.1 SINGLESTORE_USER=root SINGLESTORE_PASSWORD=pw \
uv run singlestore-mcp-serverThis starts the stdio server and blocks waiting for JSON-RPC on stdin — that
hang is expected; it means it's up. Use the MCP Inspector
(npx @modelcontextprotocol/inspector uv run singlestore-mcp-server)
for interactive testing instead of talking to stdin by hand.
Example: an S3 pipeline
create_pipeline(create_pipeline_sql="""
CREATE PIPELINE orders_pipeline AS
LOAD DATA S3 's3://my-bucket/orders/'
CONFIG '{"region": "us-east-1"}'
CREDENTIALS '{"aws_access_key_id": "...", "aws_secret_access_key": "..."}'
INTO TABLE orders
FIELDS TERMINATED BY ','
""")
start_pipeline(pipeline_name="orders_pipeline")
pipeline_status(pipeline_name="orders_pipeline")Testing
The test suite lives in tests/ (pytest + Playwright); a performance report lives in perf/.
Prerequisites
The dev dependencies in
.venv(uv sync --group devwhen no server is running from this checkout).VPN / cluster access for the
clustertests. The test server signs in with your active saved connection (setS2_TEST_CONNECTION=<name>to use another one); only without saved connections does it fall back to theenvof thesinglestoreentry in~/.claude.json. If the cluster can't be reached, those tests are skipped and the offline tests still run.Microsoft Edge for the
uitests. Playwright drives the installed Edge (channel="msedge"), so noplaywright installis needed. SetS2_TEST_BROWSER_CHANNEL=chrome(orchromiumfor Playwright's bundled browser) to use another browser.nodeon PATH for the JavaScript syntax checks (they are skipped without it).
Running
.venv\Scripts\python.exe -m pytest -m "not cluster and not ui" # offline subset (no VPN): lint, JS syntax, protocol, workload unit tests
.venv\Scripts\python.exe -m pytest # everything except the assistants and SAS (~8-12 min)
.venv\Scripts\python.exe -m pytest --assistants # also ask the in-app Claude assistants (uses Claude)
.venv\Scripts\python.exe -m pytest --sas # also the SAS Viya tests (slow: cold SAS sessions; before a release or after SAS changes)
.venv\Scripts\python.exe -m pytest tests\test_workload.py # one file
.venv\Scripts\python.exe -m pytest -k "sql_editor or copy" # by name
.venv\Scripts\python.exe -m pytest tests\ui --headed # watch the browser testsOn GitHub: the offline subset and ruff run automatically on every push and pull request,
on Windows and Linux (.github/workflows/tests.yml, the
Actions tab). The cluster, browser, SAS and assistant tests only run locally.
Use the venv's Python directly, or uv run --no-sync. A plain uv run tries to sync, and that fails
while Claude has the server's .exe open.
Markers
Marker | Meaning |
| Needs the SingleStore cluster. Skipped when |
| Starts a notebook kernel (slow). |
| Needs a signed-in SAS Viya. Skipped unless |
| Asks the in-app Claude assistants. Runs only with |
| Drives the apps in a browser with Playwright. Most also carry |
Files
test_static.py: ruff,node --checkof every inline app script and the apps' JS, and the browser-view allowlist check. Every tool an app calls must be an app tool or listed in_EXTRA_TOOLS.test_protocol.py: tools,ui://resources and prompts, plus the browser view's origin check and allowlist.test_tools.py: model-visible tools, including Claude's 50,000-character result limit; app-only tools; error handling and safety guards; local writes.test_workload.py: placeholders, validation and run comparison (offline), and a real 20 s run (cluster).test_network_recovery.py(offline, ~35 s): network breaks without a restart. The pool against a tiny MySQL-protocol server (fake_mysql.py) and the SAS Viya client against a stand-in Viya (fake_viya.py), each behind a fault-injecting TCP proxy (faultproxy.py: drop, blackhole, refuse, slow, come back, move): dropped and silent connections replaced, a readable error during an outage and success after it, a hanging login / full pool bounded, a query on a connection whose route moved retried, SAS sessions restarted with a notice, the pre-warm retrying at once, proxy / direct re-chosen, and an MCP protocol test (outage during a tool call → readable error → the same server answers again).ui/test_network_ui.py(cluster): the Workspace through a fault proxy to the real cluster shows "Connection to SingleStore lost – retrying…", recovers by itself and runs queries again.test_contrast.py(offline): WCAG contrast of the engine-chip, primary-button, alert-badge, caslib-badge and "Ask Claude" colours inshared.css, light and dark.test_presenter.py(offline): presenter-mode labels and the "Studio's own queries" classifier.ui/test_studio_ui.py: where code runs (S2 chips, run history, Notebook cells, Workload; with--sasalso SAS Compute, CAS and the pushdown chip), the Open / Save as dialogs' keyboard behaviour, presenter mode (no real connection name, host, user or e-mail in any view; results unmasked; off restores), the Studio's own queries hidden, and contrast measured on the rendered page in both themes.test_sas_guide.py: the assistant's SAS guide per language (offline: only the tab's language, once per session and language, the tab context in the question), the explicit pass-through write check, the SAS function matrix and its check in Python and in node (vendor/sas-funcs.js); with--sasa sample of the matrix's verified rows run again.test_assistants.pywith--assistants --sas: Claude's PROC SQL / FedSQL / CAS answers run in SAS.ui/test_sas_ui.py: the pre-run Check the functions bar.test_notebook.py,test_compare.py,test_assistants.py, andui/test_apps.py(Workspace views, SQL Editor, Query History, Workload, every standalone app). When a UI test fails, a screenshot is saved intests/ui/_artifacts/. The UI fixtures (ui, the screenshot hook) are intests/conftest.py, so one call can mix files fromtests/andtests/ui/(pytest tests\test_x.py tests\ui\test_y.py).
Isolated test home
The suite starts one server (python -m singlestore_mcp.server, over stdio, through the restart
supervisor) with its own SINGLESTORE_MCP_HOME in pytest's temp folder. It does not use
~/.singlestore-mcp.
These files are copied in from
~/.singlestore-mcpwhen present:connections.json,sas.json,query_history.dbandsinglestore_bundle.pem. Passwords aren't inconnections.json; the test server reads them from the OS credential store like the real one.notebook-envis linked in through a directory junction. At the end, only the junction is removed, never its target.SQL and notebook files go to a temporary
SINGLESTORE_MCP_SQL_DIR.Background alerts and the metrics sampler are off (
SINGLESTORE_MCP_ALERTS=0,SINGLESTORE_MCP_METRICS=0); the History tests take their samples withsample_now.
The tests are read-only on the cluster. Write statements are sent only to check that they are refused or
need confirmation, and are never confirmed. Scratch names start with zz.
Which SAS Viya sign-in the sas tests use. Your own sign-in lives in an encrypted secrets file that is
not copied by default. With no sign-in in the test home, the test server does what the real one does: it
reuses the SAS Viya MCP server's (~/.sas-mcp-server/credentials.json, from sas-mcp-login) or the SAS
Viya CLI's cached sign-in when that Viya accepts it. That is why the SAS (and SAS notebook) tests pass
without S2_TEST_SAS_SECRETS as long as the SAS Viya MCP server is signed in to Zeus. The sas fixture
prints the sign-in it got ("SAS tests sign in to SAS Viya with: …"). S2_TEST_SAS_SIGNIN makes the choice
explicit:
| Sign-in |
| a copy of yours with |
| only a copy of yours (secrets copied; the test server runs with |
| only another SAS tool's cached sign-in (nothing copied) |
The test server may refresh the token in its copy only. SINGLESTORE_MCP_SAS_IMPORT=0 also works for the
real server, if it should never reuse another SAS tool's sign-in.
The test home's sas.json is written in the current format (an old single-settings file is converted
there, so the test server never moves the real sign-in). To pick the Viya the sas tests use:
S2_TEST_SAS_CONNECTION (a saved SAS Viya connection's name), or S2_TEST_SAS_URL (adds a connection
with that address, named S2_TEST_SAS_CONNECTION or "Test Viya", optionally with S2_TEST_SAS_CONTEXT
as compute context). S2_TEST_SAS_STARTUP sets the Workspace startup code the SAS tests use.
test_sas_viya.py (offline) covers the connection list, migration and sign-in rules.
Performance
.venv\Scripts\python.exe perf\perf.py # ~6 min: cold start, latency p50/p95, concurrency, large results, 60 s soak, memory
.venv\Scripts\python.exe perf\perf.py --quick # ~2 minResults are written to perf/results/<version>-<timestamp>.json (gitignored). Each run is compared with
the previous results file, and p50/p95 changes over 25% are printed as warnings (never a failure).
.venv\Scripts\python.exe perf\startup.py # ~3 min: how fast the Workspace opens, cold and after restart_serverperf/startup.py measures the imports, server start → first tool answer → the calls the Workspace and
its SQL view make on open (time and size of each), restart_server → Workspace usable, the Workspace in
Edge (browser view: page → SQL Editor → schema tree, with every request), and the cluster round trips
(connects + statements) of the open sequence. Results go to perf/results/startup-<timestamp>.json
and are compared with the previous startup run. Run it in a terminal without HTTPS_PROXY (a proxy that can't
reach Viya makes the SAS pre-warm's first request wait for it).
Where the time goes (2026-10-26, medians of 6 runs, startup-*-ab-base/new-*.json; the machine varies ±30%):
Scenario | Before | After | Mostly |
Cold: spawn → handshake | 3.1 s | 3.0 s | importing the MCP SDK (~1.3–2.4 s, it loads client, HTTP and auth modules too), singlestoredb (~0.5 s), this package (~0.4 s) |
Cold: spawn → Workspace usable (open sequence done) | 4.5 s | 3.9 s | the above + the open sequence |
Cold: open sequence | 1.26 s | 1.01 s |
|
| 1.95 s | 0.84 s | was: waiting for a new connection (~1.1 s); now: loading this package (~0.4 s) + 1 round trip |
Browser view: link → schema tree shown | 1.13 s | 0.64 s | the schema (3 queries, ~450 ms) now read while |
Browser view: link → editor ready | 0.59 s | 0.57 s | parsing the SQL Editor's page (1.2 MB: CodeMirror, the ext-apps bundle) |
First SAS action after opening | ~45–60 s cold | the warm-up starts with | Viya starting the Compute server ( |
A connection costs ~8 round trips (~1.1–1.5 s): TCP, greeting, TLS (2), login, and the driver's
SET NAMES / enable_extended_types_metadata / vector_type_project_format (one each).
Available Tools
185 toolsalertsAlertsARead-only
Open the Alerts view: alerts the server raised while watching the SingleStore cluster in the background (queries running too long, slow or failed queries, failed pipeline batches / pipeline errors, node memory and disk thresholds, nodes not online), with the rules to edit and acknowledge / clear buttons.
The result includes ``browser_url``: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, and the description adds real behavior: the tool returns a browser_url and instructs how to surface it as a clickable link. It also conveys the breadth of what the server watches in the background. It stops short of describing pagination, latency, or how the acknowledge/clear affordances are triggered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and resource, and the parenthetical enumeration is informative rather than padded. The trailing browser_url rendering instruction is slightly operational noise but useful enough to keep.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 browser_url and its intended use, and by summarizing the view's contents. Nothing critical is missing for a parameterless view-open tool, though the relationship to alerts_data/alerts_badge remains unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so the baseline of 4 applies. There is no parameter behavior left to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open the Alerts view') and enumerates the alert categories it surfaces (long queries, failed pipelines, node memory/disk thresholds, nodes offline). This clearly distinguishes it as a view-opening tool, but it does not explicitly differentiate itself from siblings like alerts_data or alerts_badge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer this opens the Alerts UI, but there is no explicit when-to-use versus alternatives (alerts_data, alerts_check_now, alerts_badge) or any stated preconditions. An agent must guess whether it wants the view or the underlying data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_ackBIdempotent
Acknowledge alerts by id, or all of them.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | ||
| ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, establishing the mutation and safety profile. The description adds only the scope of acknowledgment and says nothing about side effects, reversibility, or permission requirements beyond what the annotations cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It delivers the core action and scope immediately, which is appropriate for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with annotations covering safety, the description is minimally viable but leaves gaps around id format and parameter interaction. It does not explain return values, though no output schema exists to relieve that burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates partially by mapping 'by id' to the ids parameter and 'or all of them' to the all parameter. It does not specify id format, null handling, or what happens if both parameters are supplied, so it is adequate but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Acknowledge alerts,' and clarifies scope with 'by id, or all of them.' It does not explicitly distinguish this tool from related siblings like alerts_clear or alerts_update, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the two acknowledgment modes (by id or all) but offers no guidance on when to use this tool versus alternatives such as alerts_clear or alerts_update. There are no exclusions or contextual conditions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_badgeARead-only
Unacknowledged alert count for the workspace rail (in-memory state only; cheap to poll).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered structurally. The description adds real behavioral context beyond that: the value is in-memory state only (possibly stale / not a server fetch) and is cheap to poll, which tells the agent about cost and freshness characteristics it could not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource, the UI context, and the freshness/cost caveat in parentheses. No filler, nothing redundant, and the most decision-relevant detail leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only badge counter with no output schema, the description covers purpose, cache semantics, and cost profile. The only minor gap is that it does not state the return type (a bare integer count), though 'count' strongly implies it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing parameter-related for the description to clarify or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and verb-like outcome: the count of unacknowledged alerts, scoped to the workspace rail UI. That distinguishes it from siblings such as alerts_data or alerts (which presumably return the alerts themselves) without naming them explicitly, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'cheap to poll' implicitly endorses repeated/frequent invocation, which is genuine usage guidance. However, it never states when to prefer this over alerts_data, alerts, or alerts_check_now, nor any condition under which to avoid it, leaving the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_check_nowARead-only
Run every enabled check now (read-only queries) and return the new state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes the safety profile, so the description's '(read-only queries)' largely restates structured data. It does add that all enabled checks are triggered and that the new state is returned, but says nothing about cost, duration, rate limits, or whether it modifies alert state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the key action ('Run every enabled check now') is front-loaded before the read-only qualifier and the return value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema and a readOnly annotation, the description covers the essential behavior. Return values need not be enumerated since no output schema exists, though a note on expected latency or side effects on alert state would have made it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so there is nothing for the description to disambiguate. Baseline 4 applies for a no-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: run every enabled check now and return the new state, including the read-only nature of the queries. It is clear what the tool does, though it does not explicitly contrast itself with siblings like alerts_update or alerts_ack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Run every enabled check now' implies forcing an immediate refresh versus waiting for scheduled checks, which is a useful usage cue. However, no alternatives are named and there is no explicit when/when-not guidance relative to alerts, alerts_data, or alerts_update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_clearBIdempotent
Remove alerts from the list (all, or only the acknowledged ones).
| Name | Required | Description | Default |
|---|---|---|---|
| acknowledged_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is largely covered structurally. The description adds the all-vs-acknowledged scope, but it never says whether a cleared alert is gone permanently or merely hidden from the list, nor whether the clearance is server-side or view-only — the one behavioral question an agent actually has here. The "Remove" wording also sits in tension with destructiveHint=false and is never reconciled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb first and the scope qualifier in parentheses; nothing is wasted. It is arguably too terse for a mutation tool, but it is structurally clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter tool with no output schema and annotations covering the safety profile, the description covers purpose and parameter meaning adequately. It is missing the durability/irreversibility note, which is the one piece of context an agent would want before invoking a removal operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter. It does: "all, or only the acknowledged ones" fully explains what acknowledged_only=true vs false (the default) means, which is the only parameter. It stops short of naming it, but the semantics are unambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ("Remove") and resource ("alerts from the list"), and the parenthetical clarifies the scope of the removal. It is clear on its own, but it makes no reference to any sibling (e.g., alerts_ack, alerts_update), so an agent gets no help distinguishing this from the other alert-mutating tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical "all, or only the acknowledged ones" hints at the two operating modes, but there is no guidance on when to clear versus acknowledge (alerts_ack) or update (alerts_update), nor any statement of preconditions. The agent must infer when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_dataBRead-only
Alerts, rules and checker status for the Alerts view (no cluster queries).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this a safe read, so the behavioral bar is lower. The description adds real context by stating the scope covers alerts/rules/checker status and excludes cluster queries, though it says nothing about return shape, freshness, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the scope exclusion is tacked on efficiently. It is a fragment rather than a full sentence, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, no-output-schema read tool this covers the essentials: it says what data is returned and what is out of scope. It stops short of describing the return contents or how the alerts/rules/checker status are structured, which the absent output schema would otherwise require.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema requires no semantic elaboration. Baseline 4 applies; there is nothing for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resources (alerts, rules, checker status) and scopes them to the Alerts view, which is more specific than a tautology. However, it lacks a clear verb (fetch/list) and does not distinguish itself from the sibling `alerts` tool, so an agent can't fully disambiguate from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(no cluster queries)' hints at an exclusion and effectively routes cluster data to `cluster_monitor_data`, which is a small piece of guidance. But there is no explicit when-to-use, no named alternative, and no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alerts_updateBIdempotent
Change alert rules ({name: {enabled, seconds, percent}}) and settings ({interval_s, notify}).
| Name | Required | Description | Default |
|---|---|---|---|
| rules | No | ||
| settings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the mutation and idempotency profile is covered structurally. The description adds the field shape but omits whether updates are partial or full replacements and what permissions are needed, so it adds only modest behavioral value beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no waste, front-loading the verb and resource. The dense brace notation is efficient, though slightly cryptic without further explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with two optional params and no output schema, the description gives the payload structure but leaves gaps: no mention of partial vs. full replacement behavior, no defaults, and no permission context. Adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does list the nested fields (enabled, seconds, percent, interval_s, notify). However it only names them without explaining their meaning or valid ranges, leaving the semantics of each field unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Change) and resources (alert rules and settings), and even sketches the payload shape. It is clear what the tool does, though it does not explicitly differentiate itself from sibling alert tools like alerts_ack or alerts_clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus the other alert siblings (alerts, alerts_ack, alerts_clear), nor any prerequisite or scope guidance. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
alter_pipelineA
Alter an existing pipeline from a full ALTER PIPELINE statement.
Commonly used to change the connection string/credentials or reset
offsets. Takes the full statement for the same reason as create_pipeline:
the set of alterable clauses is source-specific.
Args:
alter_pipeline_sql: The full ALTER PIPELINE ... statement.
database: Database the pipeline lives in (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| alter_pipeline_sql | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It discloses the requirement for a full statement and that alterable clauses are source-specific, which is valuable. However, it does not mention permissions, reversibility, effects on a running pipeline, or the destructive potential of resetting offsets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: a one-sentence purpose, a short use-case expansion, and a clear Args block. Every sentence earns its place; there is no repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description covers the essential usage: what SQL to supply, what the database parameter does, and why a full statement is needed. It lacks some safety/permission context, but the core calling contract is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by defining alter_pipeline_sql as 'The full ALTER PIPELINE ... statement' and explaining that database defaults to the connection's configured database. This adds meaning beyond the bare property names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Alter' and the resource 'existing pipeline', and specifies that it operates from a full ALTER PIPELINE statement. It distinguishes itself from siblings like create_pipeline and drop_pipeline by mentioning it changes connection strings/credentials or resets offsets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases ('change the connection string/credentials or reset offsets') and explains why a full statement is required, referencing create_pipeline for the same rationale. It does not explicitly state when not to use this tool or list alternatives, but the common-use framing provides clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_pageARead-only
HTML of one of this server's app pages (the workspace loads its views with this).
Tool results aren't cached by hosts, unlike resources/read, so views pick
up changes right after restart_server.
``head``: the caller's shared-head hash (its ``s2-head`` meta); when it matches,
the page comes without the shared head (``head_omitted``; the caller puts its own
copy in at SHARED_HEAD_MARKER). ``build``: the build the caller already has; when
it matches, only ``unchanged`` comes back.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | ||
| head | No | ||
| build | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declaring safety, the description adds real behavioral context beyond annotations: host caching differences vs resources/read, the head_omitted condition when the caller's shared-head hash matches, the SHARED_HEAD_MARKER insertion contract, and the 'unchanged' response when build matches. These are meaningful conditional-return semantics. It still omits failure modes and what an invalid URI yields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the length is reasonable, but the prose is dense with unexplained jargon and RST double-backtick markup (``s2-head`` meta, SHARED_HEAD_MARKER, shared-head hash) that an agent must reverse-engineer. The parenthetical about the workspace loading its views is tangential to invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description does describe the response variants (full page, head-omitted page, unchanged), which is valuable. But it leaves the required uri unspecified and doesn't cover error behavior, so an agent cannot confidently construct a valid call from the definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full parameter burden. It explains head and build well – what they represent, when they match, and the resulting output shape (head_omitted / unchanged). But the single REQUIRED parameter, uri, gets no semantics at all: no format, no example, no indication of valid page identifiers, which is a notable gap at 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource and its scope: 'HTML of one of this server's app pages', and clarifies the workspace loads its views with this tool. It implicitly separates itself from resources/read by contrasting caching behavior, though it never names a sibling tool. Clear enough for an agent to know this returns raw page HTML, but the phrasing is a noun fragment rather than a crisp verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one routing signal – unlike resources/read, results aren't cached, so this is preferred when freshness after restart_server matters. However, it never states when NOT to use it, what the URI should point to, or which of the many sibling tools is the alternative for page-related work. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_linkARead-only
Get a link that opens one of the interactive apps full-window in the user's web browser.
Use this when the user wants an app bigger than the chat allows or in
their browser. Give the user the returned URL as a clickable link. It
works on this machine only, until the MCP server restarts.
Args:
tool: The app tool: pipeline_monitor, query_grid, schema_explorer, cluster_monitor or sql_editor.
arguments: That tool's arguments, e.g. {"sql": "...", "database": "SASDP"}
for query_grid or {"database": "SASDP", "table": "CARS"} for
schema_explorer.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | ||
| arguments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the extra burden and does add meaningful traits: the link is non-persistent ('works on this machine only, until the MCP server restarts') and the result must be presented as a clickable link. It does not cover failure modes or whether the referenced app must already be open/authenticated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, followed by a single usage sentence and an Args block. Every sentence carries information an agent needs, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is unnecessary, and the description correctly tells the agent how to use the returned value. Combined with the enumerated tool values and argument examples, it is nearly complete for a 2-parameter tool; only edge behavior (invalid tool, persistence failure) is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it enumerates the accepted app names for 'tool' (pipeline_monitor, query_grid, schema_explorer, cluster_monitor, sql_editor) and gives concrete example payloads for 'arguments'. It stops short of full compensation because it doesn't state the full argument contract for each target app or what happens with an unknown tool name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and outcome ('Get a link that opens one of the interactive apps full-window in the user's web browser'), which is clear enough to separate it from direct query/editor tools. It does not explicitly contrast with the nearby sibling 'app_page', so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger: 'Use this when the user wants an app bigger than the chat allows or in their browser', plus a follow-up instruction to hand the returned URL to the user as a clickable link. No alternatives or when-not conditions are named, 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.
cas_caslibsARead-only
Caslibs on the CAS server: type, description, path and, for SingleStore caslibs, the database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes that this is a safe, non-mutating read, so the description carries a lighter burden. It usefully adds what the returned caslib records contain (type, description, path, and database for SingleStore caslibs), but says nothing about scoping, pagination, or whether all caslibs or a filtered subset are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler; the resource is front-loaded and the field list follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with no output schema, the description does the essential work by naming the fields returned. It stops short of describing scope (all caslibs? per connection?) or result shape, which is the only meaningful remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description introduces no parameter concepts that could conflict with the empty schema, and there is nothing for it to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (caslibs on the CAS server) and enumerates the fields returned, which distinguishes it from sibling listing tools such as list_databases, cas_tables, and cas_columns. It lacks an explicit verb ('list'/'retrieve'), but the noun-phrase-plus-fields phrasing makes the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the many other metadata/schema-exploration siblings (schema_explorer_databases, list_databases, cas_tables, sas_libraries). No prerequisites or exclusions are given; the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cas_columnsCRead-only
Columns of a CAS table, loaded or not (for a database caslib CAS asks the database).
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | ||
| caslib | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares readOnlyHint=true, so the safety profile is covered. The description adds genuine behavioral context beyond the annotation: columns are returned whether the table is loaded or not, and for a database caslib the CAS server queries the underlying database. It stops short of return format or cost/performance detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single terse sentence with no filler, which is good, but the terseness tips into under-specification rather than disciplined conciseness. The parenthetical is awkwardly placed and reads as an afterthought.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with no output schema, the description should at least convey what is returned (e.g., column metadata) and how to scope the request. It omits return shape entirely and leaves both parameters undocumented, so it is thin for the task.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and neither the caslib nor table parameter is explained in the description. The names are largely self-evident, which prevents a 1, but the description does no work to compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (columns of a CAS table) but reads as a fragmentary noun phrase rather than a clear verb+resource statement, leaving the action (list/retrieve columns) implied. It distinguishes itself loosely from cas_tables and sas_columns by scoping to CAS, but the parenthetical about database caslibs muddies rather than clarifies the core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus close siblings such as cas_tables, sas_columns, or describe_table. The only directional hint is the parenthetical about database caslibs, which describes a backend behavior rather than a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cas_tablesBRead-only
Tables in one caslib: the ones loaded in memory (rows, columns) and the source tables / files not loaded.
database: for a SingleStore caslib, its database (only its tables are listed).
| Name | Required | Description | Default |
|---|---|---|---|
| caslib | Yes | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes the safe-read profile, so the description only needs to add context. It does add useful return-shape information (loaded tables with rows/columns vs. unloaded sources) which matters because there is no output schema, but it says nothing about permissions, caslib resolution, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core scoping statement comes first. The parenthetical '(rows, columns)' is slightly clipped and the 'source tables / files' phrasing is a bit loose, but size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 double duty and gives a reasonable sketch of what comes back, which is the main thing an agent needs. It still leaves open how the caslib name is resolved and whether results are truncated, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and it only partially meets it. The note on ``database`` is genuinely informative beyond the bare string type — it only applies to SingleStore caslibs and narrows the listing to that database's tables — but the required ``caslib`` parameter is left completely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resource precisely (tables within a single caslib) and splits it into the two meaningful categories, in-memory tables with rows/columns versus unloaded source tables/files. An agent can tell this is a listing/scoping tool, though it never explicitly distinguishes itself from close siblings such as cas_caslibs, cas_columns, or sas_tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus cas_caslibs (to discover caslibs), cas_columns (to go one level deeper), or the sas_tables/list_tables alternatives. Usage is only implied by the fact that it enumerates tables, so the agent must infer routing on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanup_work_tablesClean up work tablesARead-only
Open the Schema Explorer's Clean-up panel for leftover SAS work tables.
SAS jobs leave work tables behind in SingleStore (SAS Data Management
``_dm…`` tables, SAS flow ``_flw…`` tables, ``SASTMP…`` / ``_tmp…``). The
panel scans every non-system database by name pattern (editable, and
optionally every table older than N days) and shows per table its rows,
size, creator, age, last use in the query history and dependent views.
The user selects tables, confirms, and they are dropped one by one (with a
dry-run mode and a log). Nothing is dropped by this call; only the user
can drop from the panel. Use this when the user wants to find or clean up
leftover, temporary or SAS work tables.
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and the description corroborates this precisely, explaining nothing is dropped by the call and only the user can drop from the panel. It adds substantial context beyond the annotation: the dry-run mode, the log, the per-table metadata shown, and the returned browser_url that should be posted as a clickable link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action in the first sentence, then supporting detail. The middle paragraph is dense but each clause (name patterns, per-table columns, confirmation flow) earns its place; the description runs long for a panel-opening tool but wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the full burden and does so: it covers what the panel shows, what the call does and does not do, and how to handle the returned browser_url. Nothing an agent needs to invoke or present the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Open the Schema Explorer's Clean-up panel for leftover SAS work tables.' The closing clarification ('Nothing is dropped by this call; only the user can drop from the panel') implicitly separates it from sibling tools like schema_explorer_cleanup_drop, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-to-use trigger: 'Use this when the user wants to find or clean up leftover, temporary or SAS work tables.' It does not name the alternative tools (schema_explorer_cleanup_scan/settings/drop) or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_configConfigARead-only
List SingleStore engine variables (configuration parameters) with their values per node, read-only.
Marks variables whose value differs from the documented default (defaults come from the docs page for the
cluster's version, downloaded once and kept locally) and variables whose value differs between nodes.
Opens the Config view; nothing is changed.
Args:
search: Only variables whose name, description or category contains this text.
changed_only: Only variables changed from the default or differing between nodes.
The result includes ``browser_url``, which opens this view full-window in the user's browser: post it
as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| changed_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true, the description discloses useful behavior: defaults are fetched from the docs page for the cluster version and cached locally, variables differing from defaults or between nodes are marked, and the Config view is opened with nothing modified. It stops short of describing result shape beyond browser_url.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and read-only guarantee are front-loaded, and the Args block is needed given the empty schema descriptions. The prose about downloading docs and posting a link under the app is slightly verbose but each element informs behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 notes the result includes browser_url and how to present it. For a read-only two-param list tool the coverage is solid, though return format details (fields per variable, node grouping) are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely does so: 'search' matches name, description, or category, and 'changed_only' filters to values changed from default or differing between nodes. Minor gaps remain (e.g. match case sensitivity), so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 SingleStore engine variables with values per node, and notes it is read-only. It is clear what the tool does, but it does not distinguish itself from the nearby sibling 'config_data' or explain how the two relate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer you call it to inspect engine variables or to see what has drifted from defaults. There is no explicit when-to-use guidance or comparison against alternatives such as config_data or schema_explorer tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitorCluster MonitorARead-only
Open a live monitor of the SingleStore cluster.
Shows every node (aggregators and leaves) with CPU, memory and disk
usage, and the queries running right now, with auto-refresh. Use this
when the user wants to see cluster load, resource usage or what is
running.
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 behavioral context beyond that: the view auto-refreshes, and the result carries a browser_url intended to be posted as a clickable link under the app, which is important for correct agent behavior. It does not describe limits such as refresh interval or whether the browser view persists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose, then usage, then output-handling instructions. Every sentence earns its place and the actionable browser_url instruction is not buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument, read-only UI-opening tool with no output schema, the description supplies everything needed: what is displayed, when to invoke it, and what to do with the returned browser_url. The absence of an output schema is compensated for by naming the key return field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema description coverage, the baseline is 4; there is nothing to document. The description correctly adds no parameter noise.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Open a live monitor of the SingleStore cluster') and enumerates exactly what is shown: per-node CPU/memory/disk and currently running queries. It is immediately clear what the tool does, though it never differentiates itself from the sibling cluster_monitor_data, so an agent must infer which one to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this when the user wants to see cluster load, resource usage or what is running' gives a clear triggering condition. It provides no explicit exclusion or alternative-tool routing (e.g. cluster_monitor_data), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_backupsARead-only
Backup overview for the Cluster Monitor's Backups tab: per database the last successful backup and its age, failed backups, sizes and durations (MV_BACKUP_HISTORY) and backups running now (MV_BACKUP_STATUS). Read-only.
Args:
warn_days: Flag databases whose last successful backup is older than this many days.
| Name | Required | Description | Default |
|---|---|---|---|
| warn_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'Read-only' adds no new information. It does add useful behavior-relevant context: the underlying views queried and the fact that results span both historical and currently-running backups. It does not disclose freshness/latency, cost, or volume characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight parts: a front-loaded purpose sentence naming concrete returned fields, then a single-argument block. Every clause earns its place with no restatement of the name or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 enumerates the returned content (last successful backup, its age, failures, sizes, durations, running backups) and explains the sole parameter. That is enough for an agent to call it correctly, though usage timing and any pagination/volume expectations are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (the parameter only carries a title, 'Warn Days'), so the description carries the full burden and does so well: it defines warn_days as the age threshold in days that triggers flagging. It omits the schema's default of 7, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (backup overview) and enumerates what it covers: last successful backup and age, failed backups, sizes/durations, and in-flight backups. It is clearly distinguished from most siblings by naming the specific data sources (MV_BACKUP_HISTORY, MV_BACKUP_STATUS). It does not explicitly contrast itself with the neighboring cluster_monitor_history/cluster_monitor_data tools, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternatives. The only contextual cue is 'for the Cluster Monitor's Backups tab,' which implies where it surfaces in the UI but does not tell the agent when to call it over other cluster_monitor_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_bottomlessARead-only
Traffic to and from remote (object) storage per node and database, for the Cluster Monitor's Bottomless tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read operation, so the description need not restate safety. It adds useful context about the data dimension (traffic per node and per database), but says nothing about return format, pagination, or whether the view is scoped to a time window, which are relevant for a monitor tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the data content and its UI context with no filler. Every clause carries information and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read view, the description adequately conveys what data is returned, and the safety profile is covered by annotations. There is no output schema, so describing return content more fully would be helpful, but the core need is met.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 no parameter syntax for the description to compensate for. Nothing in the description misleads about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific resource and scope: 'Traffic to and from remote (object) storage per node and database.' This tells the agent what data the tool surfaces, and 'remote (object) storage' plus 'Bottomless' loosely separates it from cluster_monitor_io and cluster_monitor_remote_stats. However, it does not explicitly name or contrast with those siblings, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as cluster_monitor_io or cluster_monitor_remote_stats, which cover adjacent traffic metrics. The phrase 'for the Cluster Monitor's Bottomless tab' gives a UI anchor but does not tell an agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_dataCRead-only
Refresh data (including CPU history) for the Cluster Monitor app.
| Name | Required | Description | Default |
|---|---|---|---|
| include_internal | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this as a safe read, so the description doesn't need to restate that. 'Refresh' is a read-style operation consistent with the annotation, and adding 'including CPU history' gives a useful hint about content. It still omits what exactly is refreshed, whether it hits the network, or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the key scope detail front-loaded. It is well-sized, though its brevity edges toward under-specification given the unexplained parameter rather than pure conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and an undocumented optional parameter, the description does too little. It neither explains include_internal nor describes the shape of the returned data beyond the passing mention of CPU history.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the sole parameter include_internal is never mentioned in the description. With the schema silent and the description silent, an agent has no idea what toggling include_internal does, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Refresh) and resource (data for the Cluster Monitor app), plus a concrete scope detail (CPU history). However, it never distinguishes itself from the sibling cluster_monitor tool or clarifies its relationship to it, so an agent must infer the division of labor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative pointer. The phrase 'for the Cluster Monitor app' hints at context but gives no condition telling an agent when to call this versus cluster_monitor or pipeline_monitor_data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_diskARead-only
Disk use per node by type (columnstore, logs, snapshots, plan cache, ...), per mount, and the largest databases / tables.
Args:
force: Measure the SingleStore directories again now (otherwise a measurement up to a minute old is reused).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is covered, and the description adds a genuinely useful behavioral detail beyond that: measurements may be up to a minute stale and are reused unless force is set. This caching behavior is exactly the kind of trait an agent would not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool reports, followed by a compact Args block. It is appropriately sized for a single-parameter read tool with no wasted sentences, though the Args formatting reads slightly like schema restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only monitoring tool with no output schema and one parameter, the description covers both what data is returned and how the parameter changes behavior. Only the relationship to the other cluster_monitor_* tools is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: force is explained as re-measuring the SingleStore directories immediately versus reusing a measurement up to a minute old. That fully specifies the one parameter's effect and default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and verb-implied action: disk use per node broken down by type, per mount, and top databases/tables. This is concrete and distinguishable from other monitor tools, but it never names or contrasts itself against siblings like cluster_monitor_io or cluster_monitor_bottomless, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to reach for this tool versus other cluster_monitor_* tools, nor any prerequisites or exclusions. The only usage hint is the caching note attached to force, which is about invocation mechanics rather than selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_healthARead-only
Cluster health for the Cluster Monitor's Health tab: node and availability-group state, partition health per database (masters / replicas, offline, unrecoverable, orphans), replication lag, recent cluster events (MV_EVENTS), license and version, with the problems listed worst first and a plain explanation each.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description must carry the behavioral load - and it does, disclosing that problems are ordered worst-first and come with a plain-language explanation each, plus the specific metrics returned (masters/replicas, offline, unrecoverable, orphans, MV_EVENTS). It does not discuss failure modes or empty/unreachable clusters, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the resource and then the content list. Every clause adds information (ordering, per-database granularity, event source), though the run-on length slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 takes on the job of conveying return content and does so thoroughly, including ordering semantics. It omits any note on degraded/unreachable-cluster behavior, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 disambiguate. The description correctly does not invent parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (cluster health) and enumerates exactly what it reports: node and availability-group state, partition health per database, replication lag, events, license and version. That scope clearly separates it from cluster_monitor_data, cluster_monitor_disk and cluster_monitor_io. It stops short of explicitly naming a sibling, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the Cluster Monitor's Health tab' gives implied context, and the content list lets an agent infer when this tool is the right one. However, there is no explicit when-to-use statement and no named alternative among the many cluster_monitor_* siblings, so guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_historyARead-only
Stored per-node metrics (CPU, memory, disk, queued and running queries, connections) for the History tab.
Args:
range: "1h", "24h" or "7d".
sample_now: Take one sample now first (otherwise only the local store is read; no cluster query).
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | 1h | |
| sample_now | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares the safety profile, so the bar is lower. The description adds real value: without sample_now 'only the local store is read; no cluster query,' disclosing the side effect of triggering a cluster sample when sample_now is true. That is meaningful behavior beyond the annotation, though nothing is said about volume of returned data or any sampling cadence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tight and front-loaded: one summary sentence plus a two-item Args block, no filler. The summary leads and per-parameter notes follow. Minor: 'Args:' formatting is functional rather than polished, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two params, a read-only annotation, and no output schema, the description covers both parameters and what is returned, so an agent has enough to invoke it correctly. The only gap is the absence of explicit sibling routing against the other cluster_monitor_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it enumerates the accepted range values ('1h', '24h', '7d', supplying the enum the schema lacks) and explains the otherwise-ambiguous sample_now flag, including its default-off consequence. It does not restate the defaults, but the semantics of both parameters are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: 'Stored per-node metrics (CPU, memory, disk, queued and running queries, connections) for the History tab.' An agent can tell this yields historical metrics rather than live data. It does not, however, explicitly differentiate itself from the many sibling cluster_monitor_* tools, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'History tab' framing implies when the tool is appropriate (retrieving stored/historical metrics), and the sample_now note gives a usage-relevant behavior. But there is no explicit when-to-use vs when-not, nor is an alternative sibling (e.g., cluster_monitor_data for live data) named, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_ioBRead-only
Blob cache IO over the session and the statements that waited most on the blob cache, for the IO tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's burden is reduced. It adds the useful scope detail that results are session-level and include top-waiting statements, but says nothing about freshness, time window, pagination, or result shape for a monitoring feed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler. It is slightly awkward ('IO over the session') and buries the tool's actual payload behind a prepositional phrase, but it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument read-only monitoring tool with no output schema, the description gives a rough sketch of the returned content, which is close to sufficient. It still leaves the agent guessing how this differs from the sibling cluster_monitor_* feeds and what the data covers in time or scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (blob cache IO) and what it returns (session IO plus the statements that waited most on the blob cache), which is more than a restatement of the name. However, it is a noun phrase with no clear verb and does not distinguish itself from close siblings such as cluster_monitor_disk, cluster_monitor_bottomless, or cluster_monitor_remote_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the trailing 'for the IO tab', which hints at UI context but never states when an agent should call this versus the other cluster_monitor_* tools. There are no exclusions or alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cluster_monitor_remote_statsARead-only
Bytes each bottomless database keeps in remote storage (MV_BOTTOMLESS_REMOTE_STATS queries object storage: on demand only).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description goes beyond that by revealing the data source: it queries object storage via MV_BOTTOMLESS_REMOTE_STATS. That signals a potentially expensive/slow external call, which is valuable behavioral context. It stops short of stating latency, cost, or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads what is measured and tucks the implementation/source note into a parenthetical. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only monitoring call with no output schema, the description is nearly sufficient: it identifies the metric and its source. It leaves 'bottomless' as unexplained jargon and gives no hint of the result shape, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-param tool applies. No misleading parameter claims are made.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific measurement (bytes) and resource (each bottomless database's remote storage), which is concrete and distinct from generic monitoring. However it does not differentiate itself from close siblings like cluster_monitor_bottomless, cluster_monitor_disk, or cluster_monitor_io, so an agent must guess which of these storage-related monitors to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'on demand only' hints that this is an explicit, non-automatic invocation, implicitly contrasting with continuously-reported metrics. But there is no statement of when to prefer it over the other cluster_monitor_* siblings, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
config_dataCRead-only
All engine variables for the Config view. fetch_docs downloads the docs reference when it isn't kept locally yet.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | ||
| fetch_docs | No | ||
| refresh_docs | No |
TDQS
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 one genuine behavioral nuance — that fetch_docs downloads the docs reference only when it isn't kept locally — but says nothing about what refresh or refresh_docs do or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the primary purpose is front-loaded ahead of the parameter note. The RST-style double backticks are noisy but do not cost much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with zero schema documentation and no output schema, the description explains only one parameter and never states what the tool returns. An agent cannot confidently decide between refresh and refresh_docs from this text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all three boolean parameters. It explains fetch_docs partially (downloads the docs reference when not local) but leaves refresh and refresh_docs entirely undefined, including what is being refreshed and whether they interact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a resource ("all engine variables for the Config view") but supplies no verb, so the agent must infer from readOnlyHint that this retrieves rather than mutates. "Config view" is also ambiguous relative to siblings like cluster_config or app_page, and no differentiation is offered.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this tool versus cluster_config, app_page, or the other config-adjacent siblings. The only conditional guidance concerns the fetch_docs parameter, not the tool's place among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_activateA
Make a saved connection the active one, and test it (token connections may need a sign-in first).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it non-read-only and non-destructive; the description adds real behavior beyond that by disclosing that activation also performs a connection test and that token-based connections may require a sign-in step first. It still does not say what happens on a failed test or whether the previous active connection is affected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the primary action front-loaded and the caveat demoted to a parenthetical. No filler, though the caveat sentence could be slightly sharper about the required sign-in flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no output schema, the description covers the core action and one prerequisite, which is the minimum viable. It omits failure behavior, state side effects on the previously active connection, and any permissions requirement, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'name' property is undocumented. The phrase 'a saved connection' weakly implies the parameter is the name of a previously saved connection, but the description adds no format or lookup details to compensate for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (activate) and resource (saved connection), and adds the secondary effect of testing it. It is distinguishable from connection_test or connection_save, but it never names the closest sibling use_connection, so the boundary is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb rather than stated. The parenthetical about token connections needing a sign-in hints at the connection_sso_sign_in prerequisite, but there is no explicit when-to-use/when-not guidance relative to use_connection or connection_test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_deleteADestructive
Delete a saved connection and its stored password.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds genuine value beyond them by disclosing a second destroyed artifact – the stored password – which the annotations cannot convey. It still omits whether the deletion is permanent or recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler, and the destructive outcome is front-loaded. Nothing could be trimmed without losing signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with clear annotations and no output schema, the description covers the essentials. The remaining gap is failure/irreversibility behavior, which is a minor omission at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'name' parameter, so the description carries the burden. It implies the parameter identifies a saved connection, which is meaningful, but adds no matching rules, case sensitivity, or error behavior for an unknown name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (delete) and resource (saved connection), so an agent can immediately tell it apart from connection_save, connection_test, or connection_activate. It stops short of explicitly contrasting itself with the closest siblings, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisite (e.g. that the connection must be saved/inactive), and no mention of the alternative workflows (cleanup_work_tables, connection_save) in the sibling list. The agent must infer all routing from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_helios_caA
Download SingleStore's CA bundle (needed for Helios / TLS) to ~/.singlestore-mcp once; returns its path.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered; the description adds meaningfully beyond that by disclosing the write target ('~/.singlestore-mcp'), the one-time nature ('once'), and the return value (the path). It does not mention overwrite behavior if the file already exists, which keeps it short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and resource, containing destination, purpose, cardinality, and return value with no wasted words. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter setup tool with no output schema, the description covers what it fetches, where it writes, that it need only run once, and what it returns. Adding a note about the return type or overwrite handling would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly introduces no phantom arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download SingleStore's CA bundle') plus the destination and purpose ('needed for Helios / TLS'). No sibling tool performs this setup action, so no differentiation is required, and an agent can immediately tell what this does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'needed for Helios / TLS' gives a clear trigger condition for when this tool is required. It does not name alternatives or exclusions, but no competing CA-bundle tool exists among the siblings, so the context is sufficient without that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_saveB
Create or update a saved connection. password None keeps the stored one; "" removes it.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | ||
| activate | No | ||
| password | No | ||
| original_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive write. The description adds genuinely useful behavioral detail about the password sentinel (None preserves the stored value, empty string clears it), which is not derivable from the schema. It still omits permission/auth requirements and any indication of what happens to unmentioned profile fields on update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the operation and followed immediately by the one non-obvious parameter rule. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a nested profile object, zero schema coverage, and no output schema, the description is far too thin. The password rule is a good start, but 'profile' contents, 'activate' semantics, and 'original_name' behavior are all missing, leaving the agent unable to construct a correct call from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, so the description must carry the load and only explains the password sentinel. The nested 'profile' object, 'activate', and 'original_name' (likely the rename key) are left entirely undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (create or update) and resource (saved connection), making the upsert nature of the operation explicit. It is distinguishable from connection_delete and connection_activate, though it does not name those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus siblings like connection_activate, use_connection, or connection_delete, and no prerequisites or context are given. The agent must infer that this is the persistence step for a connection profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_sso_sign_inA
Browser sign-in for SSO connections (Helios or Microsoft Entra ID): open the sign-in page in the user's browser and wait for the token (up to 2 min).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is non-read-only and non-destructive. The description adds real behavioral context beyond that: it opens a page in the user's browser (interactive, requires user presence) and blocks waiting for a token with a stated 2-minute timeout. That is valuable for an agent deciding whether to call it synchronously.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action and scope, then the mechanism and timeout. No wasted words; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema tool the description covers action, mechanism, and timeout, which is decent. It omits prerequisites (does the connection need to exist/be activated first?), what the token result looks like, and failure modes (timeout behavior).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole required parameter 'name' carries no description. The description does not clarify whether 'name' is the connection name, the SSO provider, or something else, so it fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (browser sign-in) and resource (SSO connections), and narrows scope to Helios or Microsoft Entra ID. It does not explicitly contrast with sibling sign-in tools like sas_viya_sign_in or connection_activate, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'for SSO connections (Helios or Microsoft Entra ID)' implies when this applies, but there is no explicit when-to-use/when-not guidance and no named alternative for non-SSO connections (e.g., connection_activate). Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connections_stateBRead-only
Saved connections, the active one and where passwords are stored.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 does add one genuinely useful behavioral detail — that the response exposes where passwords are stored, which is a security-relevant disclosure — but it says nothing about freshness, whether it reflects live server state, or what the snapshot contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short and free of filler, which is good, but it is a trailing noun fragment rather than a front-loaded statement of action, so an agent skimming it gets a topic rather than a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and only a readOnlyHint annotation, the call surface is trivial and the description is arguably sufficient to invoke it. However, it does not distinguish this snapshot from the many overlapping connection-related siblings, leaving routing ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. Schema coverage is nominally 100% and there is nothing for the description to clarify on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a noun phrase ('Saved connections, the active one and where passwords are stored') rather than a verb+resource statement — it never says it retrieves or returns anything. It hints at scope (saved connections, active connection, credential storage) but gives no clear differentiation from siblings like list_connections, use_connection, or connections_window.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no reference to any alternative tool. The agent must infer that this is a state-snapshot call from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connections_windowSingleStore connectionsARead-only
Open the Connections window: add, edit, test and switch between saved SingleStore connections.
It's also the Connections view of the SingleStore Workspace. The result
includes ``browser_url``: post it as a clickable link under the app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with merely opening a window, so no contradiction. The description adds genuinely useful behavioral context beyond the annotation: the result carries a ``browser_url`` and it should be surfaced as a clickable link under the app, which tells the agent what to expect and do after invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core action, followed by the view identity and output-handling note. Reasonably tight, with only slight redundancy between 'Connections window' and 'Connections view of the SingleStore Workspace'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless window-opening tool with no output schema, the description covers what it opens, what it is, and the key return value handling (browser_url -> clickable link). Adequate; only explicit sibling differentiation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. There are no argument semantics to explain and the description correctly adds none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Open') and resource ('the Connections window') and enumerates the capabilities it exposes (add, edit, test, switch connections). It does not explicitly distinguish itself from siblings such as connection_test or connection_activate, so the agent must infer that this opens a UI surface rather than performing an operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (opening a connection-management window and posting the returned browser_url as a link) but never states when to pick this over alternatives like connection_test, connection_activate, or connections_state. Guidance is present but implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_testCRead-only
Try a connection: a saved one by name, or the settings from the form.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| profile | No | ||
| password | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, which matches the 'try' semantics and raises no contradiction. The description adds the useful behavioral detail that the call accepts either a saved connection reference or ad-hoc form settings, but it says nothing about what success/failure looks like, whether `password` is required for one mode, or any side effects (e.g., does it activate the connection?).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the two-mode distinction is right up front. It is arguably under-specified rather than over-long, but as written nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema and only a read-only hint in annotations, the description should explain the two input paths more concretely (which params pair with which mode) and what the call returns on success or failure. As it stands, key operational details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and none of the three parameters are documented in the schema. The description hints that `name` refers to a saved connection and that `profile` corresponds to 'the settings from the form', but `password` is never mentioned and the relationship/mutual exclusivity between `name` and `profile` is left ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It conveys the resource (a connection) and the operation (testing it), and distinguishes two input modes: a saved connection by `name` versus form-supplied settings. The verb 'try' is informal and the tool is not differentiated from nearby siblings like `connection_activate`, `connection_sso_sign_in`, or `sas_viya_test`. Purpose is inferable but not sharp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no named alternative. An agent cannot tell from the text whether this is a prerequisite step before `connection_activate`, an alternative to `sas_viya_test`, or a purely diagnostic call. The only routing hint is the implicit name-vs-form distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pipelineA
Create a new pipeline from a full CREATE PIPELINE statement.
Pipeline definitions vary a lot by source (S3, Kafka, Azure Blob, GCS,
filesystem, ...), format (CSV/JSON/Avro/Parquet) and optional transforms,
so this tool takes the complete statement text rather than trying to
model every variant as separate parameters. It only checks that the
statement actually starts with CREATE [OR REPLACE] PIPELINE before
running it. Creating a pipeline does not start it -- call start_pipeline
afterwards, or include FOREGROUND handling via start_pipeline.
Example create_pipeline_sql:
CREATE PIPELINE my_pipeline AS
LOAD DATA S3 's3://my-bucket/path/'
CONFIG '{"region": "us-east-1"}'
CREDENTIALS '{"aws_access_key_id": "...", "aws_secret_access_key": "..."}'
INTO TABLE my_table
FIELDS TERMINATED BY ',';
Args:
create_pipeline_sql: The full CREATE PIPELINE ... statement.
database: Database to create the pipeline in (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| create_pipeline_sql | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does so well by revealing that the tool only checks for the 'CREATE [OR REPLACE] PIPELINE' prefix before running, and that the pipeline is not started automatically. These are meaningful non-obvious behaviors beyond the basic 'create' action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it leads with the action, explains why the design is statement-based, states critical behavioral caveats, and includes a representative example. Every section serves a purpose and there is minimal redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, validation behavior, start semantics, and parameter meanings, and an output schema exists to describe return values. It does not mention error cases or permission requirements, but for this tool the provided context is sufficient for correct use and routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains create_pipeline_sql as the full statement text, provides a concrete example, and clarifies that database defaults to the connection's configured database. This adds real meaning beyond the parameter names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 new pipeline from a full CREATE PIPELINE statement.' It clearly distinguishes this tool from siblings like start_pipeline, drop_pipeline, and alter_pipeline by focusing on creation from a complete statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent that creating a pipeline does not start it, and directs it to call start_pipeline afterwards. It also explains why the tool takes a full statement rather than structured parameters, which gives context for when it is appropriate. It does not state when not to use alternatives like run_sql, but the guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_tableA
Show column definitions for a table.
Args:
table: Table name.
database: Database the table lives in (defaults to the connection's
configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | ||
| database | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral context. 'Show' indicates a read-only inspection, and the default-database note adds useful behavior when the parameter is omitted. However, it does not explicitly state that no data is modified, what happens on a missing table, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by a minimal Args section. There is no filler; every line adds information about the operation or its parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter introspection tool with an output schema available, the description covers the action and all argument semantics, including the database fallback. It lacks explicit usage guidance and behavioral caveats, but those gaps are minor given the tool's simplicity and the output schema's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by documenting both parameters. It adds real meaning beyond the schema by clarifying that omitting database falls back to the connection's configured database, which is not inferable from the schema's null default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Show column definitions for a table.' This clearly distinguishes the tool from siblings like list_tables (which lists tables) and run_sql (which executes arbitrary SQL), even though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given about when to use this tool versus alternatives such as run_sql or list_tables. The intended use is only implied by the verb 'Show,' and there is no mention of when not to use it or which sibling to prefer for broader schema exploration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drop_pipelineA
Delete a pipeline. Running pipelines are stopped automatically before being dropped.
Args:
pipeline_name: Name of the pipeline to drop.
database: Database the pipeline lives in (defaults to the
connection's configured database).
if_exists: Add IF EXISTS so dropping a nonexistent pipeline is a
no-op instead of an error.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| if_exists | No | ||
| pipeline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully reveals the automatic stopping of running pipelines and that if_exists turns failure into a no-op. It does not explicitly warn that deletion is permanent or mention permission requirements, but the core side effects are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the primary purpose in the first sentence. The Args block is organized and every sentence contributes useful guidance with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential operation, side effects, and parameter semantics, and an output schema exists so return-value documentation is not required. It is nearly complete, though a brief note about irreversibility would have fully closed the gap for a destructive action with no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining all three parameters: pipeline_name's role, database's default to the connection database, and if_exists's no-op behavior. This adds real meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Delete a pipeline,' a specific verb and resource that clearly identifies the operation. It also notes that running pipelines are stopped automatically, which differentiates dropping from simply stopping a pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for permanent removal and explains that running pipelines are stopped as part of the drop. However, it does not explicitly contrast drop_pipeline with stop_pipeline or state when dropping is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
files_browseARead-only
List a folder for the file browser: subfolders and .sql / .sas (kind="sql") or .ipynb (kind="notebook") files.
``path`` defaults to the SQL folder. Only folders inside the allowed roots
(the user's home folder, the SQL folder, SINGLESTORE_MCP_FILE_ROOTS) can be browsed.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | sql | |
| path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true). The description adds genuine behavioral context beyond that: the sandbox constraint that only folders under the home folder, SQL folder, or SINGLESTORE_MCP_FILE_ROOTS may be browsed, plus which file types are surfaced. It does not describe pagination or result size, keeping it below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and return contents, followed by the default and constraint. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only browse tool whose annotations already signal safety and with no output schema, the description covers what is listed, the kind semantics, the default path, and the browseable roots. Only pagination/large-folder behavior is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and does so reasonably: it defines kind='sql' for .sql/.sas and kind='notebook' for .ipynb, and explains that path defaults to the SQL folder (the schema only shows default null). This adds real meaning over the bare schema, though it does not fully spell out path format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (List) and resource (a folder for the file browser) plus exactly what is enumerated: subfolders and .sql/.sas/.ipynb files. An agent can tell what it returns and how kind maps to extensions, though it never names the closely related sibling viya_files_browse for differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the file-browser context, the path default, and the allowed-root restriction, so an agent knows the general when-to-use situation. However, it provides no explicit comparison or routing against near-identical siblings such as viya_files_browse or notebook_files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pipeline_ddlA
Get the full CREATE PIPELINE statement that reproduces an existing pipeline.
Args:
pipeline_name: Name of the pipeline.
database: Database the pipeline lives in (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| pipeline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Get' implies a read-only retrieval and the database default is disclosed, but the description does not state behavior for missing pipelines, permissions, or whether any side effects occur. It does not contradict the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well organized: one clear purpose sentence followed by a brief, relevant Args list. Every sentence adds useful information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter retrieval tool, the description covers the return value, the required parameter, and the optional parameter's default behavior. It does not cover error cases or explicitly route between siblings, but the output schema supplies additional structure and the use case is straightforward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description documents both parameters. The database parameter explanation ('defaults to the connection's configured database') adds real meaning beyond the schema's nullable default of null, which is valuable because the schema itself has no property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a precise resource ('full CREATE PIPELINE statement') and outcome ('reproduces an existing pipeline'). This clearly distinguishes it from siblings like create_pipeline, drop_pipeline, and list_pipelines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is implied: you call this when you need the DDL to reproduce an existing pipeline. However, the description does not explicitly mention alternatives or when not to use it, leaving the agent to infer the choice from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectionsARead-only
List the saved SingleStore connections (no passwords) and which one is active.
All tools and apps use the active connection. The user manages them in the
Connections window (connections_window tool, or the workspace's Connect view).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the bar is lower, and the description still adds real value: no passwords are returned and the active connection affects all tools and apps. That is behavioral context an agent cannot get from the annotation alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Sentence one front-loads the action and its output constraints; the following two sentences each add distinct context (the significance of 'active' and where management lives). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format detail is unnecessary, and the description covers scope, semantics of the active flag, and the sibling for management. Only minor edge behavior (e.g., empty connection list) is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, which is the baseline-4 case; there is nothing for the description to disambiguate. Schema coverage of 100% means no compensating detail is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (saved SingleStore connections) and adds meaningful scope: passwords are excluded and the active connection is flagged. It is clearly distinguishable from mutation siblings like connection_activate/connection_save, though it never directly contrasts itself with the close-named connections_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent: this tool is for reading the connection list, while management happens in the Connections window (connections_window tool or the Connect view). That gives a clear division of labor, but there are no explicit when-not conditions or a named alternative for related reads like connections_state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List all databases visible to the connected user.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that results depend on the connected user's visibility, implying permission-based filtering and no modifications. Although no annotations exist, the read-only nature of a list action is sufficiently conveyed by the verb 'List'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence front-loads the action and resource, with the scope qualifier placed at the end. Every word earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an existing output schema, and a simple read-only enumeration, the description covers everything an agent needs to invoke the tool correctly. The user-visibility qualifier is a useful contextual detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the input schema is empty. There are no parameter semantics for the description to clarify, so it correctly remains brief.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List'), a clear resource ('databases'), and an explicit scope ('visible to the connected user'). It is easily distinguishable from sibling tools like list_tables and list_pipelines because it names the object type directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative guidance is provided, but the operation's purpose is self-evident: it enumerates databases, which is a distinct step from listing tables or pipelines. The context is clear and there are no exclusions or preconditions to state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pipelinesA
List all pipelines in a database and their current state (Running/Stopped/Error).
Args:
database: Database to list pipelines from (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description itself must convey behavioral expectations. It does disclose the key output trait—returning pipeline states (Running/Stopped/Error)—which is useful. However, it does not mention that this is a read-only operation, whether permissions are required, or what happens with an invalid or missing database. It is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The primary purpose is front-loaded, and the parameter explanation is minimal and directly useful. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one optional parameter and an output schema present, the description is nearly complete. It gives the resource, scope, state categories, and default parameter behavior. It could be improved by noting the absence of side effects, but this is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema description coverage is 0%, the description fully explains the one parameter: database is the target database and defaults to the connection's configured database. This adds real semantic value beyond the schema's type/default fields and compensates for the lack of schema-level documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List all') and a clear resource ('pipelines in a database'), and it differentiates itself from the more specific pipeline_status sibling by explicitly covering all pipelines and their current state. This is unambiguous and lets an agent understand the exact scope of the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: whenever you need the full set of pipelines and their states in a database. It does not explicitly contrast this with pipeline_status or other read-only siblings, nor does it give exclusions. The default-database note is helpful context but not a full usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesA
List tables (and views) in a database.
Args:
database: Database to list tables from (defaults to the connection's
configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It usefully notes that views are included and that the database parameter defaults to the connection's configured database. It does not mention permissions, output sorting, or whether system tables are included, but the 'list' wording strongly implies a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core purpose, and adds an Args section only where it adds value. Every sentence earns its place and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and an output schema available, the description covers the essential details: what is listed, the target database, and the default behavior. It is slightly incomplete only in not routing the agent to sibling tools for related tasks like listing databases or describing a specific table.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'database' as a nullable string with default null and 0% schema description coverage. The description compensates by explaining the parameter means 'Database to list tables from' and clarifying the default behavior. This goes beyond the schema, though it could still specify expected format or accepted values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('List') and resource ('tables (and views) in a database'), making the tool's purpose immediately clear. It is naturally distinguished from sibling tools like list_databases and describe_table because it explicitly targets tables/views within a database.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need to list tables or views from a database. However, it does not explicitly mention alternatives or exclusions, such as using list_databases to discover available databases or describe_table for individual table details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebookSingleStore NotebookARead-only
Open a SingleStore notebook: SQL and Python cells on a Jupyter kernel.
SQL cell results become pandas DataFrames for the Python cells; Python has
pandas, matplotlib and `conn` (a SingleStore connection). Notebooks are
.ipynb files in the user's SQL folder. It's also the Notebook view of the
SingleStore Workspace (sql_editor with view="notebook").
The result includes ``browser_url``: post it as a clickable link under the app.
Args:
name: Notebook file to open (e.g. "sales.ipynb"); omit for a new notebook.
database: Database for SQL cells (case-sensitive).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, and the description adds real behavioral context: Python cells get pandas, matplotlib and a `conn` connection, SQL results become DataFrames, and the result carries a `browser_url` that should be posted as a clickable link. It does not explain session lifetime, kernel startup side effects, or persistence behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient and front-loaded, opening with the verb+resource before elaborating on execution semantics. The middle paragraph is slightly dense but each sentence carries information the agent needs; nothing is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 discloses the key return artifact (browser_url) and how to use it, and it covers both zero-required parameters. Minor gap: it doesn't clarify what happens to an existing notebook vs. a new one, or the relationship to the kernel-control siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden, and it does: `name` is a notebook file with an example ('sales.ipynb') plus the omit-to-create semantics, and `database` is scoped to SQL cells and flagged case-sensitive. That is meaningfully more than the bare anyOf string schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a SingleStore notebook') and explains what the resource is: SQL and Python cells on a Jupyter kernel, stored as .ipynb in the user's SQL folder. It even names an equivalence with a sibling ('the Notebook view ... sql_editor with view="notebook"'), though it never differentiates itself from the very similar notebook_open/notebook_run siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied rather than stated: the args section gives 'omit for a new notebook' for name, which tells the agent how to trigger new-notebook creation, and the browser_url instruction implies a UI-flow. But there is no explicit when-to-use / when-not-to-use versus notebook_open, notebook_run or sql_editor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_askARead-only
Ask the in-app assistant about the notebook; the reply arrives in the notebook's inbox (sql_editor_inbox).
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | ||
| profile | No | ||
| question | Yes | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the valuable addition here is the asynchronous delivery behavior: the answer is not returned inline but lands in sql_editor_inbox. That is a real behavioral trait the annotations do not convey. It omits auth, rate-limit, or kernel-requirement details, keeping it below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler: verb first, resource next, delivery destination last. Nothing is repeated from the name or schema, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the critical async-retrieval behavior and points at the sql_editor_inbox sibling for fetching the reply, which is the most important missing piece for an agent. It still leaves the 'context' and 'profile' parameters and any execution prerequisites unexplained, so it is only minimally complete for a 4-parameter tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across all 4 parameters, so the description is the only place semantics could be supplied. It mentions only implicitly the notebook and question, and says nothing at all about the optional 'context' or 'profile' parameters, leaving half the surface undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ("Ask") and a specific resource (the in-app assistant about the notebook), so the agent knows exactly what the tool does. It does not explicitly distinguish itself from closely named siblings like sql_editor_ask, query_history_ask, or notebook_assistant_warm, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: stating that the reply arrives in the notebook inbox (sql_editor_inbox) signals an asynchronous, fire-and-retrieve pattern and gives the agent the follow-up tool. However, there is no explicit when-to-use vs. when-not guidance and no named alternative among the many sibling ask/assistant tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_assistant_warmARead-only
Start the notebook's assistant process ahead of the first question (no model call).
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent with that. It adds real value beyond the annotation by disclosing 'no model call', telling the agent this is a free, latency-optimizing action rather than an inference request. It does not address idempotency or prerequisites, so it stops short of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the crucial qualifier ('no model call') in parentheses. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pre-warm tool with annotations covering the safety profile and no output schema, the core intent is conveyed. However, the unexplained 'profile' parameter and the unstated behavior when the notebook is not open leave it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description mentions no parameters at all. The required notebook_id is at least obvious from the name, but the optional 'profile' parameter is completely undocumented in both the schema and the description, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start the notebook's assistant process') and clarifies the trigger point ('ahead of the first question'). It implicitly separates itself from notebook_ask via that timing cue, though it never names the sibling it is a precondition for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Ahead of the first question' clearly conveys when to use it: as a pre-warm before asking. There are no exclusions or explicit pointer to notebook_ask, so the routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_environmentBRead-only
Status of the notebook Python environment (and install progress).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The `readOnlyHint` annotation already signals a safe read operation, so the bar is lower. The description adds that it covers install progress, which is useful context beyond the annotation, but it does not explain what the status response contains or whether it is a blocking or polling call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler, and the core resource is front-loaded. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only status tool with no output schema, the description is adequate to identify the endpoint, but it leaves gaps: it doesn't clarify the relationship to `notebook_environment_install` or what the returned status includes. Given the crowded sibling set, a bit more routing context would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the schema has nothing to document. Baseline for zero parameters is 4; the description does not need to add parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource (notebook Python environment) and what it reports (status plus install progress), so an agent knows this is a read-only status check. It does not explicitly differentiate itself from sibling `notebook_environment_install` or `notebook_packages`, which is the main gap for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as `notebook_environment_install` for triggering installs or `notebook_packages` for package listing. Usage is only faintly implied by the word 'Status'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_environment_installA
Create the notebook Python environment (ipykernel, pandas, matplotlib, singlestoredb) with uv.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive mutation. The description usefully adds the package list and the installer (uv), but says nothing about idempotency, overwrite behavior on an existing environment, or expected duration for a dependency install.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the package set in parentheses. No filler, nothing that could be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 could reasonably explain the result of the install (success signal, whether packages are verifiable afterward). For a mutation tool with zero parameters, the description is adequate but leaves the post-install state and failure modes unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no schema to compensate for; the baseline for 0 params is 4. The description's package list is informational rather than parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (Create) and resource (notebook Python environment) and enumerates the exact packages installed, so an agent knows what it produces. It does not explicitly distinguish itself from the nearby sibling notebook_packages_install, which is the main remaining ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: 'Create the environment' suggests running this when the notebook environment does not yet exist, versus notebook_packages_install for adding packages to an existing one. However, no alternative is named and no precondition (e.g., environment must not already exist) is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_filesBRead-only
The .ipynb notebooks in the SQL folder, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read, so the description only needs to add context. It contributes the result ordering ('newest first'), which is genuine behavioral information, but says nothing about which folder path is used, whether results are paginated or truncated, or how entries are represented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every clause (file type, folder, ordering) carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument read tool with a readOnlyHint annotation this is close to sufficient, but with no output schema the description would ideally convey what a returned entry looks like or how to act on it. As written, an agent knows scope and ordering but not the shape of the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so there is nothing for the description to compensate for. Baseline 4 applies for a parameterless call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (.ipynb notebooks), its location (the SQL folder), and its ordering (newest first), so an agent can tell roughly what it returns. It lacks an explicit action verb like 'list', and it does not distinguish itself from neighbors such as files_browse, sql_editor_files, or notebook_open that also surface notebook files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this over the many adjacent listing tools (files_browse, sql_editor_files, notebook_open). The 'SQL folder' scope is the only implicit usage cue, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_kernel_controlB
Interrupt, restart or shut down the notebook's kernel (action: interrupt | restart | shutdown).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; they do not tell the agent that restart/shutdown discard all in-memory variables and kernel state. The description adds no such behavioral context, nor any note on permissions or what the caller observes afterward. With annotations providing minimal coverage, the description leaves a real gap for a state-altering operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb set, with the action enumeration in parentheses. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description covers the action domain adequately, and the annotations carry the (thin) safety profile. It still omits notebook_id semantics and the state-loss consequences of restart/shutdown, which an agent needs to choose this tool responsibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the action parameter has no enum in the schema, so naming 'action: interrupt | restart | shutdown' in prose is genuinely additive. However, notebook_id is left entirely undefined, and there is no indication of what notebook_id should reference or the failure mode for an unknown id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb set (Interrupt, restart, shut down) against a specific resource (the notebook's kernel), and even enumerates the accepted action values. It is clearly distinguishable from notebook_kernel_start and notebook_kernel_state by implication, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list conveys what operations exist but not when to use each one (e.g. interrupt vs restart when a cell is stuck, or shutdown when freeing memory). No alternatives, prerequisites, or when-not-to-use conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_kernel_startARead-only
Start the notebook's Python kernel ahead of the first cell (no code runs).
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is partly covered. The description usefully clarifies '(no code runs)', which explains why a kernel-start operation is non-destructive, but says nothing about idempotency if a kernel is already running, latency, or whether the notebook must be open. Adds some context beyond annotations, not rich context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scoping clarification sits in a tight parenthetical rather than bloating the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers the essentials of what the tool does and its non-destructive nature. It omits prerequisites (must the notebook be open?) and behavior when a kernel already exists, which are relevant for a kernel lifecycle tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description never addresses notebook_id, so it adds no meaning beyond the schema. However, with a single, self-evidently named identifier parameter, the practical risk of misinterpretation is low, so an adequate-but-minimal 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start the notebook's Python kernel') and adds the timing nuance 'ahead of the first cell'. It is distinguishable from notebook_run (which runs code) and notebook_kernel_state, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'ahead of the first cell' implies the use case: pre-warming the kernel before executing cells. It never explicitly states when to use this instead of notebook_run or notebook_kernel_control, leaving the routing to inference from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_kernel_stateBRead-only
The notebook kernel's state: stopped, starting, idle, busy, error or dead.
| Name | Required | Description | Default |
|---|---|---|---|
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read, so the bar is lower. The description adds genuine value by listing the six possible states (stopped, starting, idle, busy, error, dead), which tells the agent what to expect back. It does not explain how states transition, whether the call blocks, or what happens for an unknown notebook_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the states front-loaded and zero filler. It is minimal without being wasteful, though the fragment omits any verb tying it to an action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description partially fills the return-value gap by enumerating the state values, which is the key thing an agent needs. However it omits any guidance on usage, error behavior, or how the state maps to next actions, leaving notable gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter (notebook_id) is left entirely unexplained in the description. The name is fairly self-evident, but the description does nothing to compensate for the missing schema documentation as the rubric requires at low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (the notebook kernel's state) and enumerates the exact possible values it can take, so an agent knows it is a state-read, not a start/stop/control action. It is a noun phrase rather than a verb, and it does not name the sibling tools it differs from (notebook_kernel_start, notebook_kernel_control), but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no alternatives named. An agent can infer it should be called to check kernel status before running a notebook, but the description never says so, nor does it mention polling or when to prefer notebook_poll.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_openBRead-only
Read one .ipynb notebook from the SQL folder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safe-read profile, so the description only needs to add scope. It adds that the notebook comes from the 'SQL folder' and that exactly one is returned, but says nothing about what 'reading' yields (content vs. handle) or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with zero filler. The verb and scope lead, and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden of explaining the return value, which it does not — an agent cannot tell whether it gets notebook JSON, raw text, or a handle. For a read tool whose result drives the next call, this is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the single 'name' parameter is undocumented anywhere. The description hints it is a notebook name located in the SQL folder, but gives no format, extension expectation, or path semantics to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: read one .ipynb notebook from the SQL folder. This distinguishes it from notebook_run (execution) and notebook_files (listing), though it doesn't name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no alternatives named. An agent must infer that this opens a single notebook by name, with no indication of prerequisites or when to prefer it over notebook_files or notebook.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_packagesBRead-only
Packages installed in the notebook Python environment (name, version, summary, core).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 useful context by naming the fields returned, which partially compensates for the absent output schema, but it says nothing about scope (which kernel/environment it reflects) or whether results are cached/live.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact, front-loaded fragment with no filler; the resource comes first and the returned fields follow. It is appropriately sized, though a fragment rather than a full sentence limits it slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only tool with no output schema, listing the return fields is the main thing an agent needs, and the description supplies it. Minor gaps remain around which environment/kernel is being reported and any pagination or size limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. There is no parameter meaning to clarify and the description correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (packages installed in the notebook Python environment) and enumerates the returned fields (name, version, summary, core). The implicit 'list' verb and the word 'installed' distinguish it from the sibling notebook_packages_install, though the naming contrast is not stated explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no pointer to alternatives. With siblings like notebook_packages_install and notebook_environment present, the description should say when to call this versus those, and it does not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_packages_installB
Install packages (space-separated names with optional version pins) into the notebook environment.
| Name | Required | Description | Default |
|---|---|---|---|
| packages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation profile is partly covered. The description adds input-format context (space-separated, optional pins) but says nothing about whether the environment must restart, whether installs take effect immediately, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with zero filler and the resource, format, and target all conveyed compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter install tool with no output schema and annotations covering the safety profile, it is adequate but thin. It omits what success looks like, restart/refresh requirements, and behavior on failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 0% schema description coverage, the description carries the full burden and does so by explaining the syntax: space-separated names with optional version pins. That is meaningful guidance beyond the bare string type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb 'Install' plus resource 'packages' and target scope 'into the notebook environment'. However, it does not distinguish itself from the similarly-named sibling notebook_environment_install, which an agent could easily confuse with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no exclusions. The sibling set contains notebook_environment_install and notebook_packages, yet the description offers nothing about which to pick or under what conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_pollBRead-only
New output of a running (or finished) cell since output index after.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| run_id | Yes | ||
| cleared | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation, and the description adds incremental polling semantics by mentioning 'since output index after' and 'running (or finished) cell'. It does not describe return format, pagination, rate limits, or error behavior, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for the tool's simple polling purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling tool with three parameters at 0% schema coverage and no output schema, the description does not explain run_id, cleared, return values, or polling behavior. It is too incomplete for an agent to invoke confidently without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all three parameters. It only clarifies the 'after' index meaning; run_id and cleared are left undocumented in both schema and description, leaving significant gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that the tool returns new output from a running or finished cell since a given output index, which is a specific resource and operation. It does not explicitly differentiate itself from siblings like notebook_run or notebook, but the polling intent is clear from the name and phrasing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool, when not to use it, or which alternatives exist. A reader can infer it is for polling after a cell run, but the description leaves all usage context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_runADestructive
Run one notebook cell in its kernel; returns a run id to poll with notebook_poll.
cell_type "sql": a SingleStore statement whose result becomes a DataFrame
(``df``, and ``name`` if given). Statements that change data or schema
come back with ``needs_confirmation`` unless ``confirmed``.
cell_type "python": Python code, run as-is.
cell_type "sas": SAS code (DATA steps, PROCs) in the SAS Viya session; libref S2 = the notebook database.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| source | Yes | ||
| database | No | ||
| cell_type | Yes | ||
| confirmed | No | ||
| notebook_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that SQL results become a DataFrame named 'df' (and 'name' if given), that data/schema-changing statements return 'needs_confirmation' unless 'confirmed', and that SAS runs in the SAS Viya session with libref S2 mapped to the notebook database. This is exactly the kind of mutation-confirmation and side-effect context the destructiveHint annotation 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return pointer, then structures the rest by cell_type, so every line earns its place. Slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param mutation tool with no output schema, it covers return value (run id), the confirmation flow, and per-type behavior adequately. It stops short of describing failure behavior or setup prerequisites, but nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description must carry the load, and it explains cell_type values thoroughly, plus name, confirmed, and the database mapping via libref S2. notebook_id and source are left implicit, so it compensates well but not completely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run one notebook cell in its kernel') and immediately distinguishes itself from sibling notebook_poll by noting it returns a run id to poll with it. An agent can differentiate it from notebook_open/notebook_save/notebook_ask 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points clearly to the follow-up step ('poll with notebook_poll') and enumerates how each cell_type is handled, giving strong usage context. However, it does not state prerequisites (e.g., that a kernel must be started via notebook_kernel_start) or when to prefer this over siblings like notebook_ask, so guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notebook_saveC
Save a notebook (nbformat 4 JSON) as a .ipynb file in the SQL folder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| notebook | Yes | ||
| overwrite | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the write-but-not-destructive profile is already covered. The description adds the useful facts that the payload must be nbformat 4 JSON and that the file lands in the SQL folder, but it never explains what happens when a file with the same name already exists, despite an overwrite parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding; the verb and resource come first and the qualifiers follow. It is appropriately sized, though terse enough that it underspecifies rather than over-explains.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a nested-object parameter, an undocumented overwrite flag, no param descriptions, and no output schema, the description is too thin. An agent lacks the information needed to call it safely when an existing file is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, but it only indirectly clarifies the notebook parameter's format (nbformat 4 JSON). The name parameter and the overwrite flag, including its default of false, are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (save) and resource (notebook), and adds format (nbformat 4 JSON) and destination (.ipynb in the SQL folder), which lets an agent distinguish it from notebook_run or notebook_open. It does not, however, differentiate it from closely related siblings like notebook_files or sql_editor_save_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as notebook_files or notebook_open, nor any precondition guidance. Usage must be inferred entirely from the name and the mention of the SQL folder.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_errorsCRead-only
Most recent errors for one pipeline, for the Pipeline Monitor app.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| database | Yes | ||
| pipeline_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes this is a safe read. The description adds ordering ('most recent') and scope ('one pipeline'), but says nothing about rate limits, what error fields are returned, or how the limit interacts with ordering — useful context that is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no filler. It is efficient, though the terseness contributes to the gaps in other dimensions rather than being purely a virtue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, 0% parameter documentation, and only a readOnly annotation, the description is too thin for a tool that requires two identifiers and exposes a limit. It omits return shape, identifier semantics, and limit behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and adds essentially nothing about the three parameters. It does not explain that pipeline_name and database are required, nor what limit controls (default 25), nor the relationship between the two required identifiers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb+resource: retrieving the most recent errors for a single pipeline. An agent can tell this returns error data, but it never distinguishes itself from closely related siblings like pipeline_monitor_data or pipeline_status, leaving some ambiguity about which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus pipeline_monitor, pipeline_monitor_data, pipeline_status, or test_pipeline. 'For the Pipeline Monitor app' is context about the domain, not a usage condition or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_monitorPipeline MonitorARead-only
Open an interactive monitor of SingleStore pipelines.
Shows every pipeline's state, source, latest batch and recent errors, with
buttons to start, stop and test pipelines and an auto-refresh. Use this
when the user wants to see or manage pipelines visually.
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
Args:
database: Limit to one database. Omit to show pipelines in all databases.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true, the safety profile is already covered, yet the description adds genuinely useful context: the view offers start/stop/test buttons and auto-refresh, and the result carries a browser_url. That pre-empts confusion about whether this tool itself mutates anything. It does not mention permissions or any limits, so it is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the usage trigger, then result handling, then args — a sound ordering. Slightly padded and it mixes prose with a Python-style 'Args:' block, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, no-output-schema tool, the description covers purpose, trigger, the shape of the return (browser_url) and the parameter's semantics. There is no material gap an agent would need filled before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for the single optional parameter — and it does: 'Limit to one database. Omit to show pipelines in all databases.' Scope and default behavior are both fully specified, leaving nothing ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open an interactive monitor of SingleStore pipelines') and immediately scopes it to the visual/interactive surface, not raw data. The phrase 'see or manage pipelines visually' implicitly separates it from text-based siblings such as list_pipelines and pipeline_status. An agent can route to 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use this when the user wants to see or manage pipelines visually') and even post-call guidance ('post it as a clickable link right under the app'). It never names the sibling it replaces for non-visual cases, so the when-not is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_monitor_dataCRead-only
Refresh data for the Pipeline Monitor app.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says the tool 'refreshes data', which connotes a state-changing operation (reloading/regenerating data), while the annotations declare readOnlyHint=true. That is a direct conflict about whether the tool mutates anything. The description also adds no other behavioral context (auth needs, cost, side effects), so it fails the one job it had here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no padding, which is structurally clean. However, the brevity is under-specification rather than economy: the one sentence conveys almost no actionable information, so it does not fully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an undocumented parameter, no output schema, and only a single readOnlyHint annotation, the description is far too thin. It leaves the agent unable to resolve the read/write ambiguity, the meaning of the 'database' argument, or when this is preferable to pipeline_monitor or pipeline_status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional 'database' parameter has no schema description (0% coverage), and the description never mentions it at all. The agent cannot tell whether 'database' scopes which database's pipeline data is refreshed, whether omitting it means all databases, or what values are valid. The description does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a verb (refresh) and an object (data for the Pipeline Monitor app), so the general intent is graspable. But it never says what 'refresh' concretely does or what data is involved, and it does nothing to distinguish itself from siblings like pipeline_monitor, pipeline_status, or pipeline_errors. Purpose is vague rather than tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus pipeline_monitor, pipeline_status, or any other sibling. No preconditions, no exclusions, no alternatives are named. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pipeline_statusA
Get the current state of one pipeline by name.
Equivalent to SHOW PIPELINES filtered down to a single pipeline. Returns
an empty row list if no pipeline with that name exists.
Args:
pipeline_name: Name of the pipeline to look up.
database: Database the pipeline lives in (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| pipeline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the transparency burden. It signals a read-only lookup through 'Get the current state' and discloses the important edge behavior of returning an empty row list when the pipeline doesn't exist. It doesn't discuss permissions or rate limits, but for a status-read tool the key behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value: action, equivalence, missing-pipeline behavior, and the two parameters. The key semantics are front-loaded before the args detail, with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple two-parameter lookup with an output schema available, so return details need not be repeated. The description fully equips an agent to select and call the tool correctly, including the optional database context and empty-result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no property descriptions (0% coverage), so the Args section must compensate. It explains pipeline_name as the lookup key and database as the owning database with a useful default tied to the connection's configured database, adding meaning beyond the bare names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific action and resource: 'Get the current state of one pipeline by name.' The SHOW PIPELINES equivalence and the 'single pipeline' phrasing clearly separate it from list_pipelines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys this is for a targeted single-pipeline lookup and that a missing name yields an empty list rather than an error. It does not explicitly name list_pipelines as the alternative for retrieving all pipelines, so the when-not-to-use guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_advisor_reportQuery advisorBRead-only
Recommend table design changes from the whole query history: SORT KEY and SHARD KEY per table, REFERENCE table candidates, indexes and missing statistics, plus workload issues (huge results, SELECT *, failures).
Every distinct query in the history is EXPLAINed (compiled, not run) to see which columns it filters,
joins and groups on, weighted by how long those queries ran. Opens the Query History app on its Advisor tab.
The result includes ``browser_url``: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries most of the burden, and it delivers: it discloses that every distinct query is EXPLAINed (compiled, not run), that weighting is by query runtime, and that it has a UI side effect of opening the Query History app on its Advisor tab. It does not mention cost/latency or caching behavior for the expensive compile pass.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the deliverable, then the mechanism, then the browser_url usage note. Three tight sentences with no filler; the output-formatting instruction is slightly operational but genuinely useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 key return value (browser_url) and its intended use, plus the analysis method. The only real gap is the undocumented refresh parameter and any note that the first run is costly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'refresh' has 0% schema description coverage and is never mentioned in the description. Whether it forces recomputation versus returning a cached advisor report is left entirely to inference, which matters given the described expense of EXPLAINing all history.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (recommend table design changes from query history) and enumerates the concrete outputs: SORT KEY, SHARD KEY, reference-table candidates, indexes, missing statistics, workload issues. An agent can tell what it produces, though it never explicitly distinguishes itself from the sibling query_history_advisor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It describes scope ('the whole query history') but gives no when-to-use guidance, no prerequisites, and no direction on choosing it over the many sibling advisor/tuning tools (query_history_advisor, query_history_tuning, query_history_trends). The only routing hint is that it opens the Advisor tab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_gridQuery Results GridARead-only
Run a read-only SQL query and show the results in an interactive grid.
Use this when the user wants to see, browse, sort, filter or export
(CSV) query results, or when a result is too large to read as text. The
user can also edit and re-run the query from the grid. You receive only
a summary with the first 20 rows; the user sees all fetched rows.
Only read-only statements are accepted: SELECT, WITH, SHOW, DESCRIBE,
DESC, EXPLAIN (one statement, no SELECT ... INTO). For writes, DDL or when
you just need a value for your own reasoning, use run_sql instead.
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
Args:
sql: A single read-only statement.
database: Database to run it against (defaults to the connection's
configured database).
max_rows: Maximum rows to fetch, 1-10000 (default 1000). The result
is flagged as truncated when more rows exist.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| database | No | ||
| max_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the readOnlyHint annotation: the exact accepted statement types (SELECT/WITH/SHOW/DESCRIBE/DESC/EXPLAIN), the single-statement and no SELECT...INTO constraints, the fact that the agent receives only a 20-row summary while the user sees all rows, and the browser_url return value. These are consequential traits an agent could not derive from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then constraints, then args in a clean block; nearly every sentence earns its place. It runs slightly long, and the grid-editing aside ('user can also edit and re-run the query') is ancillary to the agent's task.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explains the return shape (summary, first 20 rows, browser_url, truncation flag), which is strong. The one meaningful gap is not explaining how the agent obtains the full result set (e.g., via query_grid_rows), which matters given the deliberate 20-row cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it does: sql is documented as a single read-only statement, database as defaulting to the connection's configured database, and max_rows with its valid range (1-10000), default (1000), and truncation-flag behavior. All three parameters gain meaning beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Run a read-only SQL query and show the results in an interactive grid') and differentiates itself from the read-text sibling run_sql. An agent can identify the tool's role 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions (browse/sort/filter/export results, or results too large to read as text) and a when-not with a named alternative (writes, DDL, or when you just need a value -> run_sql). It does not mention the closely-related query_grid_rows sibling, which is presumably the way to fetch beyond the summarized rows, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_grid_rowsBRead-only
Full rows of an earlier query_grid result, for the Query Results Grid app.
| Name | Required | Description | Default |
|---|---|---|---|
| result_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read, and the description adds that it returns full rows rather than a preview, plus its association with the Query Results Grid app. It omits behaviors an agent would want before calling: result expiration, row limits, pagination, or error behavior for an invalid result_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the core information front-loaded and no filler. The trailing clause about the Query Results Grid app is the one piece of mild padding, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the agent still lacks the return shape beyond 'full rows', any size or pagination expectations, and failure modes for missing or expired results. Coverage is adequate but leaves visible gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for result_id. Saying the rows come from 'an earlier query_grid result' does tell the agent where to obtain the id, but it gives no format, validity window, or reuse semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (full rows) and its provenance (an earlier query_grid result), which implicitly separates it from the sibling query_grid tool that produces the result. It is a noun phrase rather than an explicit verb, but an agent can still tell what the call returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Referring to 'an earlier query_grid result' implies the prerequisite that a query_grid call must run first and supply result_id, which is useful context. However, it never states when to prefer this over query_grid itself or what happens if the result is stale, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_historyQuery HistoryARead-only
Open the Query History: every finished query on the cluster with its runtime, user, database and result, filtered by minimum runtime (1 s and up). Select a query in the app for tuning recommendations.
Uses SingleStore's query history (event tracing, information_schema.MV_TRACE_EVENTS). Use this when the
user asks about slow / long-running queries or jobs over time (the Cluster Monitor shows only what's
running now).
Args:
min_seconds: Only queries that ran at least this long (minimum 1).
hours: Only the last N hours (default: everything in the history).
tab: "queries" (default), "trends" (daily / hourly load, failures and p95 from a local copy of the history
kept across the cluster's ring buffer, plus queries that got slower), "usage" (most used tables and
most active users) or "advisor" (table-design advice from the whole history).
The result includes ``browser_url``: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | queries | |
| hours | No | ||
| min_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes it as a safe read. The description adds beyond that: the data source (event tracing, information_schema.MV_TRACE_EVENTS), that trends/usage come from a local copy kept across the cluster's ring buffer (bounded retention), and that the result carries a browser_url to post as a clickable link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and routing constraint are front-loaded, then a clear Args block. Slightly verbose in the tab explanation but every clause carries distinct information; little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers return essentials (runtime, user, database, result, browser_url) and all three parameters for a 0%-coverage schema. The only real gap is the unresolved relationship between the 'tab' values and the many sibling history tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely meets it: it defines min_seconds ('at least this long, minimum 1'), hours ('last N hours, default everything in the history') and all four tab values with distinct meanings. It does not note the schema-level default of tab='queries' explicitly matching the arg text, but the semantics are otherwise well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open the Query History: every finished query on the cluster with its runtime, user, database and result') and even names the underlying source (MV_TRACE_EVENTS). It distinguishes itself from cluster_monitor ('shows only what's running now') but does not resolve its overlap with close siblings like query_history_data, query_history_event, query_history_trends or query_history_usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('user asks about slow / long-running queries or jobs over time') with one named alternative/exclusion (Cluster Monitor). However, it does not explain how the 'tab' values relate to the standalone sibling tools query_history_trends, query_history_usage, query_history_advisor, which appear to expose the same data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_advisorBRead-only
Table-design advice from the whole query history: sort keys, shard keys, reference tables, indexes, statistics, plus workload findings. EXPLAINs every distinct query (without running it).
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the bar is lower. The description usefully adds that it EXPLAINs every distinct query 'without running it', clarifying it does not execute the workload. It does not, however, disclose the cost/time implications of EXPLAINing an entire history or any caching behavior, which matters for this kind of workload-wide analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the purpose front-loaded and the enumerated outputs kept compact. The parenthetical '(without running it)' is load-bearing, not filler. Nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description adequately conveys the category of returned advice but says nothing about the refresh parameter, result format, or whether the analysis is expensive/long-running. Adequate for the core purpose, incomplete around parameters and operational cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter (refresh, default false) is not addressed anywhere in the description. The description therefore leaves the agent to infer the meaning and effect of refresh entirely from its name, failing to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific output (table-design advice) and enumerates the covered artifact types — sort keys, shard keys, reference tables, indexes, statistics, workload findings — plus the source scope (whole query history). An agent can tell what it produces, though it does not name or distinguish itself from likely-overlapping siblings like query_history_tuning or query_advisor_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never states when to choose this tool over the many adjacent siblings (query_history_tuning, query_advisor_report, query_history_assistant). There are no conditions, prerequisite statements, or exclusions — only an implicit sense that it is an advisory/analysis tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_answerCRead-only
Claude's in-app answer for one query (or its progress while it works).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read. The description adds genuine value by noting the call may return 'progress while it works', alerting the agent to a partial/in-flight result. However, it says nothing about how the key is obtained or how often to poll.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the key idea (in-app answer plus progress state) front-loaded and no filler. Slightly cryptic, but every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no meaningful annotations beyond readOnly, so the description should explain the return shape (answer vs. progress indicator), how to obtain the key, and polling expectations. It covers only the high-level purpose, leaving a documented async tool under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single required 'key' parameter, so the description carries the full burden. It implies the key identifies a query, but gives no format, source, or uniqueness semantics, leaving the agent unable to know what value to pass.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (Claude's in-app answer for one query) and hints at an async/progress state, but the verb is only implied and the resource description ('one query') is vague. It does not distinguish this tool from siblings like query_history_ask or query_history_assistant, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of the sibling that presumably initiates or cancels this workflow (query_history_ask / query_history_ask_cancel). The agent gets no routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_askBRead-only
Ask Claude, in the app, how to tune one query from the history; poll query_history_answer for the reply.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| profile | No | ||
| question | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is non-mutating, so the safety profile is covered. The description adds valuable non-obvious behavior beyond annotations: the operation is asynchronous and its result must be retrieved from a separate tool. It still omits whether the question is required, expected latency, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action front-loaded and the follow-up step appended. No wasted words, though it is arguably too terse for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The async ask-then-poll pattern is the key non-obvious element and it is covered, with no output schema to explain. Still, with 0% schema coverage and a required 'key' parameter completely undocumented, the definition is not fully sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters. The description only loosely gestures at 'one query from the history' (the key) and says nothing about the profile or question parameters, so it fails to compensate for the undocumented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: ask Claude, in the app, how to tune one query from the history. It is distinguishable from siblings like query_history_answer (the reply side) and query_advisor_report, though it does not explicitly name the sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the async workflow by directing the agent to poll query_history_answer for the reply, which is genuinely useful routing. However, it never says when to prefer this over query_history_assistant, query_history_advisor, or sql_editor_ask.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_ask_cancelCRead-only
Stop Claude's in-app answer for one query.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, which is arguably in tension with a 'stop/cancel' verb (though cancelling a stream need not mutate stored data). The description says nothing about what happens to the pending answer, whether it is discarded or partially returned, or whether the cancel is idempotent, so the behavioral burden is largely unmet.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler; the action and scope lead the sentence. It is efficient, though the brevity comes at the cost of the missing detail noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cancellation tool with an undocumented required key, no output schema, and only a readOnlyHint annotation, the description leaves the agent guessing about target identity and post-cancel behavior. It is not sufficient on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required parameter 'key' has 0% schema description coverage and the description never explains it — the agent cannot tell whether it is a query ID, an answer ID, or a session key. With low coverage the description was expected to compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (stop) and a specific object (Claude's in-app answer for one query), which is more precise than a bare name restatement. It does not differentiate itself from the near-identical sibling sql_editor_ask_cancel, nor from query_history_ask/query_history_answer, so an agent must infer the pairing from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance at all: it does not say to call this only while an answer is still generating, nor that it is the query-history counterpart of sql_editor_ask_cancel. The agent gets no condition that selects this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_assistantCRead-only
Whether Claude can answer in the app (Claude Code installed).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes this is a safe read. The description adds almost nothing beyond that — it doesn't state what the tool inspects, what happens when Claude Code is not installed, or what the caller should do with the result. No contradictions with annotations, but very little added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but this is under-specification rather than conciseness — a single cryptic fragment that fails to convey the operation. Brevity here costs clarity rather than earning it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 must carry the full burden of explaining what the tool returns (presumably a capability/availability flag) and when to invoke it. It does neither, leaving the agent unable to predict the return value or usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics for the description to explain; the baseline for a 0-param tool applies. Nothing is missing on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Whether Claude can answer in the app (Claude Code installed)' is a sentence fragment that never names a verb or resource — it is unclear whether the tool checks capability, enables an assistant, or reports installation state. It does not distinguish itself from the many sibling assistant tools such as query_history_assistant_warm or sql_editor_assistant. An agent cannot confidently tell what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this tool, when not to, or which sibling to prefer. With many near-named alternatives (query_history_assistant_warm, query_history_ask, query_history_answer), the absence of routing guidance is a serious gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_assistant_warmARead-only
Start the screen's Claude process ahead of the first question (no model call).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 useful behavioral context with '(no model call)', telling the agent this preloads a process without incurring inference, but it says nothing about latency, cost, or what the warm-up actually achieves. Modest value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the core action first and the key caveat (no model call) parenthesized. Zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only warm-up call with no output schema, the description is close to sufficient: it says what it does and that no model call happens. It could say a bit more about expected effect or whether it is safe to call repeatedly, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 per the rubric; there is nothing to document in the schema and the description correctly implies no input is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (start/preload the screen's Claude process) and clarifies it performs no model call, which distinguishes it from the actual assistant siblings like query_history_assistant and query_history_ask. It does not explicitly differentiate itself from the other _warm variants (sql_editor_assistant_warm, notebook_assistant_warm), but the resource and action are clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'ahead of the first question' implies when to invoke it (before asking), giving usable context, but it does not state that the tool is optional, when NOT to use it, or how it relates to the other _warm tools. 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.
query_history_compare_cancelCRead-only
Stop a running comparison (the statement running now is cancelled too).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the tool stops/cancels running work, which is an action with side effects, yet the annotations declare readOnlyHint=true. That is a direct inconsistency: the agent is told this is a side-effect-free read while the text describes terminating live statements. The extra detail about the in-flight statement being cancelled is useful, but it is precisely what contradicts the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with the action verb front-loaded and the side effect appended in parentheses. Nothing is wasted and it is easily scanned. It is not padded, though it is arguably too terse to be fully useful rather than 'concise'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing cancel operation with no output schema and no meaningful annotation support, the definition leaves key questions unanswered: what happens to partial comparison results, what the tool returns on success or on an already-terminated job, and whether job_id must reference a live job. The one behavioral detail given (the running statement is also cancelled) is helpful but insufficient for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is exactly one parameter, job_id, and schema description coverage is 0% — the schema gives only a type and title. The description makes no attempt to explain what job_id is, where to obtain it (e.g., from query_history_compare_start or query_history_compare_status), or what format it takes. With one undocumented parameter, the description fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb (stop) with a specific resource (a running comparison), and the parenthetical clarifies exactly what gets stopped: the statement running now. An agent can distinguish it from query_history_compare_start and query_history_compare_status without opening a schema. It stops short of naming siblings explicitly, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the implied scenario (a comparison is running and you want to halt it) but offers no explicit 'when to use this vs. alternatives' guidance. It never says whether the job_id comes from query_history_compare_start, whether query_history_compare_status should be checked first, or what happens if the job already finished. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_compare_candidatesBRead-only
The heaviest read-only queries in the history that read table (database.table), with the table name
replaced by new_table (nothing is run).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| table | Yes | ||
| new_table | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint is already declared and the description reinforces it with 'nothing is run,' which is a useful confirmation that the substitution is a dry run. Beyond that it doesn't disclose result ordering semantics or what 'heaviest' is measured by (duration, cost, rows).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler. The core action leads, and the clarifying parentheticals follow, though parsing the nested quotes and backticks takes some effort.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should indicate what comes back. It implies the returned queries have their table name rewritten, but it never says the result is a list of candidate queries bounded by 'limit,' leaving the return shape to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It partially does: it documents that 'table' uses a database.table format and that 'new_table' replaces the table name in the matched queries. The 'limit' parameter (default 8) is never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (find the heaviest read-only queries in history) and resource (queries reading a given table), and clarifies the table-name substitution. It reads as a candidate-selection step ahead of query_history_compare_start, but it doesn't explicitly name or distinguish itself from that sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. With siblings like query_history_compare_start, query_history_compare_status and query_history_compare_cancel in the same family, the agent must infer that this tool feeds the comparison workflow rather than starting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_compare_startBRead-only
Run the selected candidate queries against the original and the new table (wrapped in COUNT(*)),
alternating, runs times each. Poll query_history_compare_status.
| Name | Required | Description | Default |
|---|---|---|---|
| runs | No | ||
| table | Yes | ||
| shapes | Yes | ||
| new_table | Yes | ||
| timeout_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply readOnlyHint=true and openWorldHint=false, and running COUNT(*) queries is consistent with that read-only profile. The description adds useful behavior the annotations don't cover: the alternating execution and the ``runs`` repetition count, and the polling requirement implies an asynchronous job. It stops short of disclosing whether the runs happen server-side, expected runtime, or timeout behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler, front-loading the core action before the follow-up poll instruction. The backtick around runs adds a small readability hiccup but otherwise the structure is efficient and well-ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter async comparison tool with no output schema and only minimal annotations, the description covers the start-and-poll lifecycle adequately but leaves the required `shapes` parameter and timeout semantics unexplained. An agent can launch the job but must guess at the meaning of a required argument.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description carries the full burden and only partially delivers. It references ``runs`` explicitly and implicitly maps 'original and the new table' to table/new_table, but says nothing about the required `shapes` parameter or `timeout_s`, leaving two parameters completely undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Run) and resource (the selected candidate queries against the original and new table), plus the mechanical detail that queries are wrapped in COUNT(*). It distinguishes itself from siblings like query_history_compare_candidates and query_history_compare_status by naming the run-then-poll workflow. Lacks an explicit statement of the end goal (performance/correctness comparison), which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Poll query_history_compare_status' names the required follow-up tool, giving implied workflow guidance. However there is no explicit statement of when to use this versus the other compare_* siblings, nor any precondition (e.g. that candidates must be selected first). Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_compare_statusCRead-only
Progress and results of a before/after comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this as a safe read, and the description adds only the bare hint that a result may be partial via the word 'progress'. It says nothing about terminal states, whether polling is expected, or what happens for an unknown job_id, so it adds little beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence fragment with no filler — appropriately sized. It is front-loaded but under-specified rather than concise in the informative sense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 should explain what 'progress' and 'results' look like and when the job is done, but it does not. Combined with zero parameter documentation, it is not sufficient for an agent to call this correctly in a polling loop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter job_id has 0% schema description coverage and the description says nothing about it — not where the id comes from (presumably query_history_compare_start) nor its format. The description does not compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase names the resource (a before/after comparison) and what is returned (progress and results), so the purpose is inferable. But there is no verb, and it never says this is a status poll for a job started by a sibling such as query_history_compare_start, so it does not distinguish itself from query_history_compare_candidates or query_history_compare_cancel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of alternatives, and no statement that this is the polling step following query_history_compare_start. The agent must infer the entire workflow from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_dataCRead-only
Refresh the Query History list.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | ||
| limit | No | ||
| min_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is known, but the description adds nothing beyond that: it does not explain what 'refresh' does (re-query, cache reload?), what range is affected, or what the list contains. For a data-fetching tool the description contributes almost no behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is terse rather than padded, but the terseness comes at the cost of under-specification for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With three undocumented parameters, no output schema, and no guidance distinguishing it from numerous query_history siblings, the description is not complete enough for an agent to call the tool correctly beyond guessing defaults.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the three parameters (hours, limit, min_ms) are completely undocumented. The description mentions no parameters at all, so it fails to compensate for the coverage gap; an agent cannot know what hours/limit/min_ms control.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb ('Refresh') and resource ('Query History list'), so the basic action is discernible. However, it does not differentiate from the many sibling tools such as query_history, query_history_event, or query_history_trends, leaving the agent unsure how this 'list refresh' differs from those.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many query_history_* siblings, and no exclusions or prerequisites. The usage context is only vaguely implied by the word 'refresh'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_eventBRead-only
One query from the history with its full SQL and details.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description is consistent with a safe read. It adds that the response includes full SQL and details, which is useful, but says nothing about permissions, error behavior when the key is unknown, or payload size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler and the core payload front-loaded. It is efficient, though arguably too terse given the gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description should clarify the return; it partially does ('full SQL and details'). However, the one required parameter is unexplained, leaving the definition inadequate for correct invocation in some cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage on the single required 'key' parameter, the description carries the burden and fails to explain what a key is (query ID, hash, index, composite?). 'One query from the history' only hints at it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (one query from the history) and the payload (full SQL and details), which is enough to distinguish it from list-oriented siblings like query_history or query_history_data. It lacks an explicit verb, but retrieval of a single item is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus query_history, query_history_data, query_history_advisor, or the many other query_history_* siblings. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_plan_tuningBRead-only
Tuning recommendations for a statement known only from the plan cache (its totals and cached plan).
| Name | Required | Description | Default |
|---|---|---|---|
| plan_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, lowering the bar. The description adds the useful context that the statement is reconstructed from plan cache totals and a cached plan, but says nothing about response format, latency, or whether a missing/stale plan_key causes an error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scoping qualifier is placed immediately after the resource. It is slightly terse for a fragment-style line, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with no output schema, the description covers the essentials at a minimum level, but it omits how to obtain a plan_key and what the recommendations look like, leaving clear gaps given the surrounding query_history_* family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for plan_key, and the description only indirectly implies that plan_key identifies an entry in the plan cache. That is a small amount of added meaning, but it does not explain the format or provenance of a plan_key, which the agent needs to obtain one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('Tuning recommendations for a statement') and the scoping condition ('known only from the plan cache'). It is specific and distinguishable from a generic tuning tool, but it never names the obvious sibling query_history_tuning, so the agent must infer the boundary rather than being told it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'known only from the plan cache (its totals and cached plan)' implies the usage condition — use this when you lack full statement history and only have a plan_key. However, no alternative tool (e.g. query_history_tuning) is named and there are no explicit exclusions, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_profileARead-only
PROFILE one read-only query (SELECT / WITH) from the history: runs it once more and returns the operator tree with actual rows, time, memory, spilling and segments skipped (SHOW PROFILE JSON).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| timeout_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by disclosing that the tool 'runs it once more' (a re-execution with real cost) and enumerates what the profile returns: operator tree, actual rows, time, memory, spilling, segments skipped. Annotations only state readOnlyHint/openWorldHint, so this re-execution detail is genuinely additive; it still omits timeout behavior and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the verb, input constraint, re-execution caveat and return contents with no filler. It is dense but every clause earns its place; readability slightly suffers from the parenthetical load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 enumerates the return contents (operator tree, rows, time, memory, spilling, segments skipped) and clarifies the input is a SELECT/WITH from history. The main gap is the completely undocumented 'key' and 'timeout_s' parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description never mentions the 'key' or 'timeout_s' parameters. 'from the history' faintly implies key refers to a history entry, but neither the required key nor the timeout default is explained, leaving the parameter burden unmet.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (PROFILE) and resource (one read-only query from the history) and pins down the exact artifact returned via '(SHOW PROFILE JSON)' with a field list. This clearly separates it from sibling tuning/plan tools like query_history_plan_tuning or query_history_tuning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'one read-only query (SELECT / WITH) from the history' tells the agent the applicable scope and that it operates on an existing historical query. It does not explicitly name an alternative tool or a when-not condition, so it lands 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.
query_history_trend_runsBRead-only
The queries behind one Trends bar (a day "YYYY-MM-DD" or an hour "YYYY-MM-DD HH"), slowest first.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket | Yes | ||
| failed_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read. The description adds the return ordering ('slowest first') and the bucket granularity, which is useful behavior beyond the annotation, but it says nothing about result size, limits, or how failed_only filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that identifies the resource, the bucket union type, and the sort order with no waste. Slightly terse but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't explain returns since it already states ordering. It covers the critical bucket format, yet the failed_only parameter goes unexplained and there is no note on result volume for a potentially large drill-down query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does document the required bucket format (day 'YYYY-MM-DD' or hour 'YYYY-MM-DD HH'), which is genuinely valuable, but failed_only is left entirely undecoded in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific resource (the queries behind one Trends bar) and scope, distinguishing it from the sibling query_history_trends which produces the bar itself. An agent can tell this is the drill-down tool, though it uses a noun phrase rather than an explicit verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'behind one Trends bar' – the agent infers it is called after viewing a trend, for a specific bucket. There is no explicit when-to-use, no exclusions, and no reference to how failed_only changes the selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_trendsBRead-only
Daily / hourly query counts, runtime, failures and p95 from the local copy of the history, plus query shapes that got slower than the week before.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds useful context by noting the data comes from a local copy of history and includes a week-over-week slowdown comparison, but it omits return format, pagination, auth details, and how the local copy may differ from live data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that lists the returned metrics efficiently. It is appropriately sized and contains no filler, though it could be slightly clearer with punctuation around the final comparison clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and no output schema, the description conveys what data is returned and the comparison baseline. However, it leaves parameter semantics unaddressed and gives no routing guidance among the many sibling query_history tools, so it is only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (days) with 0% schema description coverage, and the description never mentions it or its default of 30. Unlike a zero-parameter tool, this single parameter meaning is left entirely unstated, so the description does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific analytical output: daily/hourly query counts, runtime, failures, p95, plus slower query shapes versus the prior week. It clearly identifies the resource (query history trends) but does not name or distinguish itself from sibling tools like query_history, query_history_data, or query_history_tuning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is given, despite many sibling query_history_* tools. The output description implies trend analysis, but the agent receives no criteria for choosing this tool over query_history_compare_candidates, query_history_advisor, or query_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_tuningBRead-only
Tuning recommendations for one query from the history (EXPLAIN, plan cache statistics, table design).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds useful context by naming the analysis content returned (EXPLAIN, plan cache statistics, table design), but says nothing about permissions, cost, or how the key is obtained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with the core purpose stated first and details in parentheses. No wasted text, though it could carry slightly more load given the gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 hints at the return content, and the readOnly annotation covers safety. However, for a tool whose only input is an undocumented key, it leaves the agent without enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'key' parameter. The phrase 'one query from the history' only loosely implies that key identifies a query; it provides no format, source, or example, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Tuning recommendations for one query from the history'. The parenthetical names the concrete artifacts returned (EXPLAIN, plan cache statistics, table design). It does not explicitly distinguish itself from siblings like query_history_advisor or query_advisor_report, so it's clear but not differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives, despite several closely related siblings (query_history_advisor, query_advisor_report, query_history_ask). Only the implicit 'one query from the history' scope hints at usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_history_usageBRead-only
Most used tables and most active users over the last days (0: everything stored), from the local
copy of the query history (traced runs) and of the plan cache (every execution, no user).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already guarantees a safe read, and the description adds real value by disclosing the data provenance: a local copy of the query history (traced runs) plus the plan cache (every execution, no user). The 'no user' caveat around plan cache data is a useful behavioral nuance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the returned content. Some formatting noise (double backticks around ``days``) and a slightly run-on parenthetical keep it from being maximally clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 describe what comes back (most used tables, most active users). But in a large query_history family it omits any routing signal, leaving the agent to guess among many similar siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'days' parameter, so the description must carry it, and it does explain the lookback window and the special value 0 = everything stored. However, it does not clarify units or default behavior beyond that, so the compensation is only partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: it returns the most used tables and most active users, with a scoping window. This distinguishes it from generic query_history or query_history_trends siblings, though it does not name an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of when another sibling like query_history_trends or query_history would be preferred. The parenthetical about the days parameter is scoping, not usage routing, so the agent is left to infer when this tool applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resource_pool_statusARead-only
Resource pools now: limits per pool, running / queued queries summed over nodes, the workload manager queue with the resource each queued query is waiting for (threads, connections or leaf memory), and the users whose default pool it is. Read-only. Opens the Security view on the Resource pools tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description redundantly confirms 'Read-only.' However it adds a genuine behavioral trait beyond annotations: it navigates the UI by opening the Security view on the Resource pools tab, which an agent would not otherwise expect from a status read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with 'Resource pools now:' and confined to two sentences. The long enumerative middle clause is dense but every element is informative; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description compensates by enumerating what the snapshot contains and confirming the read-only nature, which is enough for an agent to call it correctly. It could still say more about the response shape or scope, but it is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description appropriately does not attempt to document nonexistent inputs and instead spends its budget on output content.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (resource pools) and enumerates the exact snapshot contents: limits per pool, running/queued queries, the workload manager queue with the awaited resource, and default-pool users. This is far more specific than a tautology, but it never distinguishes itself from close siblings like security_pools or workload_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over the related pool/workload/security siblings. The only routing-style statement is a UI note ('Opens the Security view on the Resource pools tab'), which is not a use-case or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_serverAIdempotent
Restart the SingleStore MCP server so code and app changes load, without reconnecting.
Open apps keep working after a reload of the app; browser links made before the restart stop working.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: running apps survive, browser links created before the restart break, and reconnection is not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the purpose front-loaded and no filler. The second sentence ('after a reload of the app') is slightly awkward and mixes 'reload' with 'restart', which mildly clouds the state consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers the key operational side effects (session survival, link invalidation, no reconnect), though it does not say whether in-flight queries or active connections are interrupted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a param-free tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Restart the SingleStore MCP server') plus the reason ('so code and app changes load'). No sibling tool performs a restart, so the agent can identify it immediately from the name-and-description pair.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear trigger condition — restart is for loading code/app changes. It does not state when NOT to restart or name any alternative, so it falls short of explicit routing, but the 'why' is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_sqlA
Run one arbitrary SQL statement against SingleStore and return the results.
Use this for SELECT/DML/DDL that isn't pipeline-specific. For creating,
altering, starting, stopping, dropping or inspecting Pipelines, prefer
the dedicated pipeline tools -- they validate the statement type and are
easier to call correctly.
Args:
sql: The statement to execute.
database: Database to run it against (defaults to the connection's
configured database).
max_rows: Truncate returned rows to this many (does not affect how
many rows the statement itself processes).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| database | No | ||
| max_rows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral transparency burden. It clearly indicates the tool executes arbitrary SQL, includes DML/DDL, returns results, and clarifies that max_rows only truncates returned rows without limiting statement processing. It stops short of explicitly warning that arbitrary DDL/DML may be destructive or require elevated permissions, though this is strongly implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose first, routing guidance second, then a clear Args list. Every sentence earns its place, and there is no redundant or vague wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an arbitrary-SQL tool of this complexity. It covers scope, exclusions, parameter behavior, and output-truncation semantics. An output schema exists to define return values, and sibling-tool differentiation is handled explicitly, so an agent has enough to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain the parameters. It does: sql is 'the statement to execute,' database defaults to the connection's configured database, and max_rows 'truncate[s] returned rows' without affecting how many rows the statement processes. This adds meaningful semantics beyond the sparse schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run one arbitrary SQL statement against SingleStore and return the results.' It also distinguishes itself from pipeline-specific tools by explicitly listing what types of SQL it is for versus what should go to sibling pipeline tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this for SELECT/DML/DDL that isn't pipeline-specific.' It also names the excluded category and gives a reason to prefer alternatives: pipeline tools 'validate the statement type and are easier to call correctly.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_classifyCRead-only
For "Run all" in a SAS language: which statements need confirmation (write outside WORK / CASUSER).
| Name | Required | Description | Default |
|---|---|---|---|
| library | No | ||
| language | Yes | ||
| statements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a classification/analysis operation, so no contradiction. The description usefully discloses the classification criterion (write outside WORK/CASUSER), but omits what the output looks like or how the confirmation flag is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence, so nothing is padded, but it is too terse to be front-loaded meaningfully and reads as a cryptic fragment rather than a complete statement of purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 should explain what the classification returns (e.g., which statements need confirmation and in what form), and it does not. With 3 parameters and 0% schema coverage, the definition is incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely fails it. It only hints at 'language' and 'statements' and says nothing about the 'library' parameter's role or the expected statement format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys that the tool classifies SAS statements by whether they require confirmation (writes outside WORK/CASUSER), which is a meaningful purpose. However, it is written as a sentence fragment with no explicit verb, and it does not differentiate from the similar sibling sql_editor_classify, leaving the exact operation ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It situates usage ('For "Run all" in a SAS language') but gives no when-to-use/when-not guidance and names no alternative such as sql_editor_classify or workload_parse_statements. The agent must infer the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_columnsBRead-only
Columns of one SAS table: name, type, length, format, label.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | ||
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds only the returned attribute set and says nothing about error behavior for a missing table, result size, or ordering; with annotations carrying the safety profile, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded fragment with no filler sentences. It is efficient, though the telegraphic style removes the verb and some clarity an agent might want.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only metadata tool with no output schema, the field list partly substitutes for a return description. However, the meaning of library/table and the relationship to sibling column-listing tools remain unexplained, leaving the definition minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so both required parameters (library, table) are undocumented anywhere. The description alludes to 'one SAS table' but never explains what library means (SAS libref vs path) or the table naming/qualification rules, so it does not compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource ('columns of one SAS table') and enumerates the returned attributes (name, type, length, format, label), so the agent knows this returns column-level metadata. It is a noun fragment with no verb, and it does not distinguish itself from near-siblings like cas_columns or sas_lookup_columns, so it stays 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this versus sas_tables, sas_lookup_columns, cas_columns, or describe_table, nor any precondition (e.g., library/table must exist). Usage must be inferred entirely from the name and field list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_connection_activateA
Make a saved SAS Viya connection the active one: the Workspace's SAS sessions restart on it, and new notebook kernels use it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description adds genuinely useful side-effect disclosure — that the Workspace's SAS sessions restart on the new connection and new notebook kernels pick it up. The restart is the key behavioral fact an agent needs and would not get from annotations. It stops short of noting any live-session disruption to running queries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, followed by its two concrete consequences. Nothing is padded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema and clear annotations, the description covers the state change and its downstream effects. Adding where to obtain the connection name (or a prerequisite to save first) would close the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter ('name') with 0% schema description coverage, so the description must carry the meaning. Calling it a 'saved SAS Viya connection' does imply the name identifies an existing saved connection, which is helpful, but no format, case sensitivity, or source of valid values (e.g., sas_connections_state) is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('make ... the active one') and resource ('saved SAS Viya connection'), so the agent knows exactly what state change occurs. It does not, however, distinguish itself from near-identical siblings such as connection_activate or use_connection, which an agent must disambiguate on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the effect described (activate a saved connection), but there is no statement of when to prefer this over connection_activate, use_connection, or sas_connections_state, nor any prerequisite that the connection must already be saved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_connection_deleteBDestructive
Delete a saved SAS Viya connection and its sign-in.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds one genuinely useful fact beyond that — that the associated sign-in is destroyed too — but says nothing about permissions required, reversibility, or confirmation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One efficient sentence with the destructive verb and scope front-loaded; nothing is wasted. It is arguably under-specified rather than over-long, but structurally sound.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema operation with a single identifier parameter, the description covers the key side effect but omits irreversibility, required privileges, and the effect on any currently active session using that connection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter ('name') with 0% schema description coverage, and the description never explains what the name identifies (saved connection label vs. profile vs. host). For a single obvious identifier this is adequate but not compensating for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('a saved SAS Viya connection') and even names a secondary effect ('and its sign-in'). It does not, however, distinguish itself from related siblings such as connection_delete or sas_connection_save, so the agent gets no routing help beyond the name itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites (e.g. must the connection be deactivated first), and no mention of alternatives like sas_viya_sign_out or connection_delete. The agent must infer all usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_connection_saveB
Create or update a saved SAS Viya connection (name, Viya address, compute context, client ID, certificate
check, SingleStore libref, CAS server, startup code). activate also makes it the active one.
| Name | Required | Description | Default |
|---|---|---|---|
| activate | No | ||
| connection | Yes | ||
| original_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-read-only, non-destructive profile. The description usefully adds upsert semantics ("create or update") and the activate side effect, which go beyond the annotations, but says nothing about permissions required, behavior on update of existing settings, or what fields are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence carrying the verb, resource, and field inventory. The long parenthetical field list is dense but each item earns its place; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 and nested-object input, the definition covers the connection fields but leaves the two scalar parameters undocumented and gives no return or post-save behavior. Annotations carry the safety profile, but the update/rename semantics remain underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It enumerates fields inside the nested ``connection`` object (name, Viya address, compute context, client ID, etc.), which adds real meaning, but it never explains the ``activate`` or ``original_name`` parameters — critically, ``original_name`` is undocumented despite being needed for the rename/update path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific upsert operation ("Create or update a saved SAS Viya connection") and enumerates the relevant connection fields, so an agent knows the resource and scope. It partially differentiates from close siblings like sas_connection_activate and connection_save by noting the activation side effect, but does not clearly distinguish this tool from the near-identical connection_save sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the parenthetical field list and the note about ``activate`` hint at when saving applies, but there is no explicit when-to-use guidance or exclusion versus sas_connection_activate/sas_viya_save/connection_save. The agent must infer the conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_connections_stateBRead-only
Saved SAS Viya connections, the active one and each one's sign-in (from the stored token; no network).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds that sign-in data comes from the stored token and requires no network call, which is useful behavioral context beyond the annotation, but it does not cover other traits such as staleness or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single compact sentence with no filler, front-loading the resource and return contents. The fragment style is slightly less structured than a full sentence, but it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input schema, no output schema, and a simple read-only annotation, the description conveys what the tool returns and notes the local-token/no-network behavior. It is largely complete for invocation, though a clear verb and usage context would improve it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters, so the schema provides no parameter semantics and the description need not add any. Baseline for 0 params is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes the resource (saved SAS Viya connections) and the contents returned (active connection, per-connection sign-in), but uses a noun phrase without a verb and does not explicitly differentiate from siblings such as connections_state or sas_viya_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit guidance on when to call this instead of alternatives; the parenthetical 'from the stored token; no network' hints at a non-network state check but is not framed as usage criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_executeBDestructive
Run one SAS statement the user confirmed in the SQL Editor (writes outside WORK / CASUSER included).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| tab | No | ||
| file | No | ||
| tab_id | No | ||
| library | No | ||
| options | No | ||
| language | Yes | ||
| max_rows | No | ||
| pushdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description adds real value by disclosing the scope of that destruction: writes are not limited to the temporary WORK/CASUSER libraries. It also constrains the call to a single statement. It omits permissions/auth requirements and any rate or reversibility notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler; the destructive scope is parenthetically attached rather than diluting the main clause. Nothing wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter destructive execution tool with no parameter descriptions, no output schema, and no annotation beyond hints, the description is far too thin. It neither documents the optional targeting parameters nor describes what is returned or how results are surfaced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 9 parameters at 0% schema description coverage, the description carries the full burden but explains almost nothing. 'One SAS statement' loosely maps to the sql parameter and 'SAS' to language, but tab, file, tab_id, library, options, max_rows, and pushdown are entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Run one SAS statement') and scopes it to a statement 'the user confirmed in the SQL Editor'. Clear purpose, but it does not differentiate itself from close siblings like sas_query, sql_editor_execute, or run_sql, which all appear to execute SQL/SAS.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'the user confirmed in the SQL Editor' implies a usage constraint (only run already-confirmed statements, one at a time), which is meaningful. However, it never states when to prefer sas_execute over sas_query or sql_editor_execute, nor any exclusions, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_history_lookupCRead-only
Is this SQL (sent to SingleStore by SAS) in the cluster's plan cache or the local query history?
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered, but the description adds nothing further: it doesn't say what a hit/miss result looks like, whether both locations are always checked, or what happens if neither contains the SQL. The lower bar from annotations keeps this from being a 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is efficient, though the interrogative phrasing is slightly less scannable than a declarative statement of what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two parameters, zero schema descriptions, and no output schema, the description is too thin – it leaves the `database` argument and the result shape undefined. An agent would have to guess how to invoke it beyond the required SQL string.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden. It implicitly maps to the required `sql` parameter ('this SQL') but says nothing about the optional `database` parameter, which scope or filtering role remains entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely – SQL sent to SingleStore by SAS – and the two places it is looked up (cluster plan cache vs. local query history). It is framed as a question rather than a statement of action, but an agent can still tell it apart from siblings like sas_query or query_history_ask.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given: it never says whether this should be preferred over query_history, query_history_data, or sas_query, nor what preconditions (e.g. a live SAS/SingleStore connection) must hold. Usage must be inferred entirely from the name and the question phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_librariesBRead-only
SAS libraries in the Workspace's SAS Compute session (compute context + startup code): engine, path and, for SAS/ACCESS to SingleStore (engine S2 / SSTORE), the SingleStore database.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read operation, lowering the burden. The description adds useful context by explaining where the libraries come from (compute context + startup code) and what fields are exposed, but says nothing about the refresh behavior or return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is compact and front-loads the resource and scope. It is slightly dense with the parenthetical SingleStore clause, but there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with no output schema, the description conveys the returned fields adequately. However it omits any explanation of the one parameter's effect and the output/pagination behavior, leaving gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (refresh, default false) with 0% schema description coverage, and the description never mentions it. With low coverage the description is expected to compensate, but it provides no information on what refreshing does or when to set it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific resource (SAS libraries) and its scope (the Workspace's SAS Compute session), plus the fields it returns (engine, path, SingleStore database). It is clear about what is being surfaced, though it never uses an explicit verb like 'list' and only implicitly distinguishes itself from siblings such as sas_tables and sas_columns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool versus alternatives like sas_tables, sas_columns, or sas_sources, nor any prerequisites or context conditions. The agent must infer usage entirely from the name and resource noun.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_lookup_columnsARead-only
Columns of up to 8 SAS tables ([{library, table}]) for the SQL Editor's autocomplete, in one call:
SAS libraries for procsql / fedsql, caslibs for cas. A table that doesn't exist comes back with
missing: true (not an error), so the editor can remember it briefly and not ask again.
| Name | Required | Description | Default |
|---|---|---|---|
| tables | Yes | ||
| language | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint to disclose two meaningful behaviors: nonexistent tables return missing:true rather than erroring, and the batching cap of 8 tables. Both are decision-relevant facts an agent needs to plan calls, though return shape and per-table failure modes beyond 'missing' aren't covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the batch size, element shape, and library-vs-caslib mapping appear first, with the missing-table behavior framed as the reason for the tool. No filler sentences, though the parenthetical RST code formatting is slightly noisy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param read-only lookup with no output schema, the description supplies the essential call-shaping facts (batch cap, element shape, language-to-library mapping) plus non-obvious non-error semantics. A short note on the return payload's per-table keying would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and both params are undocumented in the schema, so the description carries the burden. It explains the tables element shape as [{library, table}] and ties language to proc/fedsql vs. cas, which is genuinely necessary; but it omits valid language values and array length beyond the cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieving columns for a batch of up to 8 SAS tables, scoped to the SQL Editor's autocomplete. Clear what it does, though it doesn't distinguish itself from sibling column-lookup tools like sas_columns and cas_columns beyond language/library context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Context is implied (SQL Editor autocomplete), and it hints at the 'remember briefly, don't ask again' caching behavior, but there is no explicit when-to-use vs. siblings like sas_columns or cas_columns. An agent could reasonably wonder whether to prefer those single-purpose tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_queryARead-only
Run one statement from the SQL Editor as PROC SQL / FedSQL (SAS libraries) or FedSQL in CAS (caslibs).
``language``: procsql, fedsql or cas. The SQL is wrapped (proc sql; … quit; etc.); text starting with
proc / data / % runs as plain SAS code. Statements that write anywhere but WORK / CASUSER are answered with
``needs_confirmation`` (the app asks, then calls sas_execute). ``pushdown`` adds sastrace / the FedSQL plan
and returns what was sent to SingleStore with a verdict. ``history`` false: not recorded in the editor's
run history (the Schema Explorer's previews).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| tab | No | ||
| file | No | ||
| tab_id | No | ||
| history | No | ||
| library | No | ||
| options | No | ||
| language | Yes | ||
| max_rows | No | ||
| pushdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=true by disclosing non-obvious mechanics: statements are wrapped (proc sql; … quit;), text starting with proc / data / % runs as plain SAS code, write statements outside WORK/CASUSER are intercepted with needs_confirmation and routed to sas_execute, and pushdown returns the SingleStore payload with a verdict. This is exactly the kind of behavior an agent cannot get from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core purpose, and the following parameter notes are dense but each earns its place by disclosing a distinct behavior. The code-fenced parameter formatting is slightly heavy versus the payload it delivers, but there is little outright waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema and no annotation depth beyond readOnlyHint, the behavioral picture is solid (wrapping, write interception, pushdown, history) and some return values are hinted at (needs_confirmation, verdict). It is nonetheless incomplete: six parameters are unexplained and the return shape is only partially implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full param burden. It defines the most critical param well (language: procsql, fedsql, cas — values absent from the schema) plus pushdown and history, but tab, file, tab_id, library, options and max_rows remain completely undocumented in either place.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run one statement from the SQL Editor') and immediately scopes it to PROC SQL / FedSQL over SAS libraries or FedSQL over caslibs, which separates it from generic SQL runners. It never names the neighbouring tools (sas_execute, sql_editor_execute, run_sql), so the differentiation is by modality rather than by explicit contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the needs_confirmation flow (writes are deferred to sas_execute) and through the history/pushdown switches, so an agent can infer intent. However it never states explicitly when to pick this over sas_execute or sql_editor_execute, and offers no exclusions or prerequisites, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_session_resetA
End the Workspace's SAS Compute and CAS sessions; the next run starts new ones (startup code runs again).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so the description must add the behavior — and it does: it explains that the current sessions are terminated and the next run provisions new ones with startup code executed again. It does not mention that in-memory/work state in those sessions is lost, which is the one 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action first and the consequence second. No filler, nothing that can be cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and a simple lifecycle action, the description covers what an agent needs to call it correctly and anticipate the side effect. The only missing piece is an explicit warning that current session state (work tables, librefs) is discarded rather than carried over.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. There is nothing parameter-related for the description to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("End") and resource ("SAS Compute and CAS sessions") plus the resulting scope of the operation. An agent can distinguish this from siblings such as sas_viya_sign_out or restart_server 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The implied use case (you want fresh sessions so startup code re-runs, e.g. after config changes) is conveyed by the parenthetical, but there is no explicit when-to-use/when-not-to guidance and no naming of alternatives like restart_server or sas_viya_sign_out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_sourcesBRead-only
Whether SAS Viya is set up and signed in (for the SAS libraries / caslibs sources); starts no session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates it is a safe read operation. The description adds that it starts no session, which is useful behavioral context beyond the annotation. However, it doesn't describe return values, latency, or authentication requirements, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the key information. It could be slightly clearer, but it avoids unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, no output schema, and a readOnly annotation, the description provides minimal but adequate context. However, for a status-check tool in a crowded sibling environment, it should clarify how it differs from similar tools like sas_viya_state or sas_viya_test.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, parameter semantics are not applicable, so the baseline is 4. The description adds no parameter information, which is appropriate since none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a status check for SAS Viya sign-in and setup in the context of SAS libraries/caslibs sources, and clarifies it does not start a session. However, the purpose is muddled by awkward phrasing ('Whether SAS Viya is set up and signed in'), and it does not clearly differentiate from sibling tools like sas_viya_state or sas_viya_test.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as sas_viya_state or sas_viya_test. The only hint is 'starts no session,' which implies it's a lightweight check, but no when-to-use or when-not-to-use instructions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_tablesCRead-only
Tables (data sets and views) in one SAS library, with rows and columns where SAS knows them.
| Name | Required | Description | Default |
|---|---|---|---|
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read, so the description only needs to add context. It contributes the scoping constraint ('one SAS library') and the caveat that column/row metadata exists only 'where SAS knows them', but says nothing about permissions, result size, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the resource stated up front. The trailing qualifier 'where SAS knows them' is slightly vague but the description is appropriately sized for a one-parameter listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description is minimally sufficient: it conveys what is returned (tables with row/column metadata). It omits how many results come back, whether results are paginated, and how to choose among the many sibling listing tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole required parameter 'library' is undocumented. The phrase 'in one SAS library' only weakly implies the parameter scopes the query to a single library; it says nothing about expected format (libref vs. name) or whether it accepts patterns/lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely and even disambiguates SAS terminology ('data sets and views'), but never supplies a verb ('list'/'enumerate') and offers no differentiation from siblings like sas_libraries, sas_columns, cas_tables, or list_tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of any alternative tool. An agent gets no help deciding between this, cas_tables, schema_explorer_tables, or list_tables.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_viya_saveB
Update the active SAS Viya connection with the settings given (others stay; an empty address never blanks the saved one). Without any connection, an address creates one.
| Name | Required | Description | Default |
|---|---|---|---|
| settings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the agent knows it's a non-destructive write operation. The description adds valuable behavioral detail: partial updates preserve existing settings, empty address does not blank the saved value, and creation behavior when no connection exists. This goes beyond annotations, though it doesn't cover authentication requirements or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the main action and then adds two important behavioral clauses. It is concise and every part earns its place, though slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations cover safety, and there is no output schema, the description provides some necessary context (merge behavior, creation). However, for a tool with a complex nested parameter and zero schema description coverage, it lacks sufficient detail about the settings object's structure and expected fields, leaving the agent under-informed about how to construct valid input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has one required parameter 'settings' with 0% schema description coverage and a nested object schema with additionalProperties=true. The description mentions 'the settings given' and references 'an empty address', implying the settings object may contain an address field, but it does not enumerate or describe any other possible fields. With such low schema coverage, the description fails to compensate adequately, leaving most parameter semantics undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: updating the active SAS Viya connection with given settings. It distinguishes itself from siblings like connection_save and sas_connection_save by targeting the SAS Viya connection specifically and describing the update/merge behavior. However, it doesn't explicitly differentiate from other save-related siblings, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (update active connection, create if none), but does not explicitly state when to use this tool versus alternatives like connection_save or sas_connection_save. There are no exclusions or prerequisites mentioned, leaving the agent to infer appropriate scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_viya_sign_inA
Sign in to a saved SAS Viya connection (default: the active one). Without code: open SAS Logon in the
browser. With code: finish signing in with the code SAS Logon shows. Saves no settings.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | ||
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it non-readonly and non-destructive, so the safety bar is partly covered. The description adds genuine behavioral context beyond that: it discloses a browser-opening side effect and the two-step code flow, and explicitly states 'Saves no settings' (unlike sas_viya_save), which is exactly the kind of persistence disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the primary purpose is front-loaded before the mode-specific detail. Each sentence earns its place by adding either scope or invocation behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step auth tool with no output schema and no annotation detail, the description covers the core flow adequately but leaves gaps: the 'name' parameter is unexplained, and there is no indication of what a successful or failed sign-in returns or requires of the user.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter burden. It explains 'code' well ('the code SAS Logon shows'), and '(default: the active one)' loosely implies the connection selector, but the 'name' parameter itself is never named or explained, leaving one of two parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Sign in to a saved SAS Viya connection') and separates the call from sas_viya_sign_out by verb. It also spells out the two operating modes, though it does not name the neighboring alternatives (sas_viya_test, sas_viya_state, connection_sso_sign_in) that an agent might 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives real conditional guidance for invoking the tool ('Without code... With code...'), which tells the agent how to drive the two-phase flow. However it never states when to choose this tool over siblings like connection_activate, connection_sso_sign_in, or sas_viya_test, so the when-to-use-vs-alternatives layer is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_viya_sign_outC
Forget the sign-in of a SAS Viya connection (default: the active one).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give only readOnlyHint=false and destructiveHint=false, so the description should carry the behavioral load. It does not say whether stored credentials are removed permanently, whether the session is terminated, or whether other saved connections are affected. The default-target note is the sole added behavior detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the action and the resource, with the default behavior appended. Nothing is redundant, though the phrasing 'Forget the sign-in' is slightly indirect where 'sign out' would be crisper.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single optional-parameter tool with no output schema, the description is roughly adequate: it names the target and its default. It still leaves the post-condition (session ended? credentials wiped?) unstated, which an agent about to revoke an authentication state would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'name' parameter has only a null default with no description. The parenthetical 'default: the active one' meaningfully explains what happens when name is omitted, which is real added value, but it does not say how to identify a named connection or what a valid value looks like.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb-plus-resource is specific ('Forget the sign-in of a SAS Viya connection'), and the sibling sas_viya_sign_in makes the inverse operation obvious. It is clear what the tool does, though 'Forget' is softer than the conventional 'sign out' phrasing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as connection_delete or sas_connection_delete. The only contextual clue is the parenthetical default, which is really parameter behavior, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_viya_stateBRead-only
Settings and sign-in status of a SAS Viya connection (default: the active one).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation. The description adds that it reports settings and sign-in status and defaults to the active connection, which is useful context, but it does not disclose what 'settings' includes or any failure conditions. Given the annotation coverage, this is an adequate but not rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, well-formed sentence with no filler. The default behavior is placed in parentheses, keeping the core purpose front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one optional parameter and no output schema, the description covers the essential purpose and default behavior. It leaves gaps in usage context and sibling differentiation, but those are not critical for a basic state-inspection tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'name' has no schema description (0% coverage), so the description must compensate. It partially does by stating '(default: the active one)', clarifying which connection is queried if 'name' is omitted, but it does not explain the expected string format or naming conventions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a SAS Viya connection) and what it reports (settings and sign-in status), making the tool's retrieval purpose clear. It does not, however, distinguish itself from sibling tools like sas_connections_state or connections_state, so an agent could still hesitate between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The parenthetical only explains the default parameter behavior, not when to select this tool over alternatives such as sas_viya_sign_in or sas_viya_test.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sas_viya_testARead-only
Check a SAS Viya connection's sign-in and compute context (lists the compute contexts; starts no SAS session). Reuses the SAS Viya MCP server's or CLI's sign-in to the same Viya if there's no own one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already tells the agent this is safe, and the description usefully adds two traits beyond that: it starts no SAS session, and it reuses the MCP server's or CLI's existing sign-in when no dedicated one exists. That is real auth/behavior disclosure, though nothing is said about what a failed check looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the action and its scope, with no filler. The second sentence's phrasing ('if there's no own one') is slightly awkward but costs almost nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 state the salient return content (compute contexts are listed) and the key side-effect guarantee (no SAS session started). The only real omission is what the sign-in check reports and what 'name' does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter, 'name', with 0% schema description coverage, and the description never mentions it. It is unclear whether 'name' selects the Viya connection, the compute context, or something else, so the description fails to compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check a SAS Viya connection's sign-in and compute context') and sharpens scope with the parenthetical that it lists compute contexts and starts no SAS session, which separates it from sas_viya_sign_in and sas_query. It never names a sibling outright, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied ('check a connection') but there is no explicit when-to-use or when-not guidance versus near-neighbors like connection_test, sas_viya_state, or sas_viya_sign_in. The note about reusing an existing sign-in is behavioral context, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorerSchema ExplorerARead-only
Open an interactive Schema Explorer for the SingleStore cluster.
Shows every database and its tables/views with storage type
(columnstore/rowstore/reference), row counts and sizes; for a selected
table it shows columns, shard key and sort key, the full CREATE TABLE DDL
and a 50-row data preview. The user can browse freely and ask follow-up
questions from the UI. Use this when the user wants to explore, browse or
understand the schema visually. For a plain list of tables or columns
inside your own reasoning, list_tables / describe_table are cheaper.
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
Args:
database: Pre-select this database (case-sensitive). Omit to start at the database list.
table: Pre-select this table or view in `database` (case-sensitive). Requires `database`.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| database | No |
TDQS
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 behavioral context beyond that: it is interactive, the user can browse freely and ask follow-up questions, and it returns a browser_url meant to be posted as a clickable link. It does not mention pagination or size limits on the preview, but the UI-opening behavior is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then capabilities, then usage routing, then return-value handling, then args. Information-dense with minimal filler; the Args block is slightly repetitive of the prose but still earns its place as structured detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the key return artifact (browser_url) and how to present it. Combined with the full capability and parameter coverage, an agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the load and does so: it explains that database pre-selects a database (case-sensitive) and that omitting it starts at the database list, and that table pre-selects within database and requires database. The cross-parameter dependency and case-sensitivity are both stated, though the failure behavior when table is given without database is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open an interactive Schema Explorer for the SingleStore cluster') and then enumerates exactly what it displays (databases, tables/views, storage type, row counts, shard/sort keys, DDL, preview). It distinguishes itself from the list-oriented siblings by framing itself as a visual browsing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('when the user wants to explore, browse or understand the schema visually') and a when-not-to-use with named alternatives ('For a plain list of tables or columns inside your own reasoning, list_tables / describe_table are cheaper'). 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.
schema_explorer_analyzeAIdempotent
Run ANALYZE TABLE on the given tables, one statement per table, and report each result.
Refuses unless ``confirm`` is true: call it only after the user saw the plan
(schema_explorer_analyze_plan) and explicitly confirmed. At most 10 tables per call.
Args:
database: Database (case-sensitive).
tables: Base tables to analyze (case-sensitive), at most 10.
confirm: Must be true: the user's explicit confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| tables | Yes | ||
| confirm | No | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description is consistent with a non-destructive maintenance operation. It adds behavior the annotations cannot convey: the tool refuses to run without explicit confirmation and enforces a 10-table ceiling per call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The refusal rule and the prerequisite are front-loaded before the Args block, which is good structure. Minor redundancy: 'at most 10 tables' appears in both the body and the Args section, and the confirm requirement is restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and 'report each result' is the only hint at return content, which is thin for a per-table operation. However, the gating, limits, and parameter semantics an agent needs to invoke it correctly are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates: it documents all three parameters, flags case-sensitivity for both database and tables, restricts tables to base tables with a 10-item cap, and defines confirm as requiring the user's explicit confirmation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (run ANALYZE TABLE on the given tables) plus execution granularity (one statement per table) and output behavior (report each result). This clearly separates it from the sibling schema_explorer_analyze_plan, which is referenced as the planning step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the precondition (call only after the user saw the plan via schema_explorer_analyze_plan and explicitly confirmed), the hard gate (refuses unless confirm is true), and the scale limit (at most 10 tables per call). Both when-to-use and the alternative sibling are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_analyze_planARead-only
Read-only plan for ANALYZE TABLE: per base table its statistics (age, outdated / missing columns, row-count drift), whether they look stale and why, and the exact statements. Runs nothing.
Args:
database: Database (case-sensitive).
tables: Tables to include (case-sensitive). Omit for every base table in the database.
| Name | Required | Description | Default |
|---|---|---|---|
| tables | No | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this with 'Runs nothing', which is a meaningful guarantee beyond the hint. It also discloses the return content (stat age, outdated/missing columns, row-count drift, staleness reasons), though it does not address pagination or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in one sentence, then a compact Args block. Every line earns its place with no redundancy, though the parenthetical statistics list is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 describes the return payload adequately, and both parameters are documented despite zero schema coverage. For a read-only planning tool with readOnlyHint, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does: it documents both parameters, flags case-sensitivity for both, and explains that omitting 'tables' defaults to every base table. This meaningfully compensates for the empty schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read-only plan for ANALYZE TABLE') and enumerates exactly what the plan contains: per-table statistics, staleness diagnosis, and exact statements. 'Runs nothing' cleanly separates it from the sibling schema_explorer_analyze, which presumably executes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Runs nothing' implies this is the preview/plan counterpart to an executing analyze tool, which gives usage context. However, it never explicitly names the alternative (schema_explorer_analyze) or states when to prefer the plan over execution, leaving the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_cleanup_dropADestructive
Drop the selected work tables one statement at a time (DROP TABLE IF EXISTS), for the Clean-up panel.
Re-checks each table on the server; system databases are refused and a table
with a dependent view is skipped unless that view is listed in ``views``
(it is then dropped first). With ``dry_run`` only the statements are returned.
Args:
tables: [{"database": "SASDP", "name": "_dmallchars"}, ...]
views: Dependent views to drop as well, same shape.
dry_run: Only show the statements; drop nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| views | No | ||
| tables | Yes | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag it as destructive, and the description adds substantive behavior beyond them: server-side re-checks, refusal of system databases, dependent-view skipping unless the view is passed in 'views', and dry_run returning statements only. This is exactly the kind of safety disclosure 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the drop action and constraint behavior, then an Args block. Every sentence contributes; only minor redundancy in restating the panel context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 3-param tool with no output schema, the description covers action, guardrails, params, and dry-run behavior. The return format of the non-dry-run path is not described, but that is a minor gap given the annotations carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the param burden and does so well: 'tables' and 'views' get an example shape ({"database": "SASDP", "name": "_dmallchars"}) and 'dry_run' is explained. It omits that dry_run defaults to true, which the schema supplies, keeping it just short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Drop the selected work tables ... for the Clean-up panel') with an implementation detail (one DROP TABLE IF EXISTS per table). An agent can tell what it does, though it does not explicitly differentiate itself from siblings like cleanup_work_tables or schema_explorer_cleanup_scan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Clean-up panel' framing and the dry_run mode imply when it is used, and the view-handling rule implies prerequisites, but there is no explicit when-to-use/when-not or named alternative. 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.
schema_explorer_cleanup_scanARead-only
Find leftover work tables by name pattern (and age), for the Schema Explorer's Clean-up panel.
Args:
patterns: [{"pattern": "_dm*", "kind": "SAS DM"}, ...]; shell-style, case-insensitive. Omit for the saved ones.
older_than_days: Also offer every table not created/altered for this many days.
recent_days: Tables used or created this recently are flagged as risky.
save: Store these settings in ~/.singlestore-mcp/cleanup.json.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| patterns | No | ||
| recent_days | No | ||
| older_than_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, and the description adds genuinely new behavior: tables used/created recently are 'flagged as risky,' and save persists settings to ~/.singlestore-mcp/cleanup.json. It still does not describe the return shape (e.g., list of table names vs. a report), but for an annotated read-only tool this is useful added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-sentence purpose followed by a compact per-parameter list; each line carries parameter meaning rather than filler. The 'Args:' docstring style is slightly awkward but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should say what the scan returns, and it only hints at 'risky' flags without describing the result structure or how the two age filters combine. Everything needed to invoke it correctly is present, but the read side is under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it largely succeeds: it documents the pattern object shape ('{"pattern": "_dm*", "kind": "SAS DM"}'), shell-style case-insensitive matching, the omit-for-saved default, and the persistence path for save. The rough edge is that 'kind' is never explained and the interaction between older_than_days and recent_days is only loosely described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Find leftover work tables by name pattern (and age), for the Schema Explorer's Clean-up panel.' An agent can tell this is the discovery/scan step of the clean-up flow. It does not explicitly disambiguate itself from sibling tools like schema_explorer_cleanup_drop or cleanup_work_tables, but the verb 'Find' implies non-destructive scanning.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it belongs to the Clean-up panel and 'Omit for the saved ones' tells the agent when to leave patterns out. There is no explicit when-not or comparison to alternative siblings (e.g., schema_explorer_cleanup_settings, cleanup_work_tables, schema_explorer_cleanup_drop).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_cleanup_settingsCRead-only
Read (or change the dry-run default of) the Clean-up settings, plus recent log entries.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, yet the description explicitly advertises a state change ('or change the dry-run default of'). This directly contradicts the read-only annotation, so the agent cannot trust either signal about whether calling the tool mutates configuration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the primary read behavior and the parenthetical qualification kept short. Nothing is padded, though the compressed phrasing contributes to the read/write ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It states the read scope and mentions log entries as part of the return, which is reasonable given there is no output schema. It is incomplete on the mutation side: no prerequisites, no indication of what changing the dry-run default affects, and no guidance on required permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single dry_run parameter, so the schema supplies only a title and default. The description partially compensates by framing dry_run as a 'default' to be changed rather than a per-call flag, but it never explains what true/false/null values mean or how they interact with the settings read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Read ... the Clean-up settings') and even brackets the write variant, which is enough to separate it from siblings like schema_explorer_cleanup_scan and schema_explorer_cleanup_drop. It is slightly muddled by the parenthetical, but an agent can tell what the tool targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given, and none of the cleanup siblings (scan, drop, cleanup_work_tables) are referenced as alternatives. The agent is left to infer from the name alone when this settings tool is appropriate versus the scan/drop tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_databasesARead-only
List databases with table/view counts, for the Schema Explorer app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read, so the description's main added value is the mention of table/view counts, which hints at the returned shape in the absence of an output schema. It says nothing about ordering, pagination, or scope limits (all databases vs. a connection), which for a listing tool would be worth one more clause.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the most useful information (what is listed and what comes with it) appears immediately. Nothing could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only signal about return values, and it does name the returned counts, which is the right instinct. It stops short of describing the full result shape or how this feeds into the sibling tables/table/preview tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond what the empty schema already conveys. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List databases') plus added value ('with table/view counts') and an app scope ('for the Schema Explorer app'). It does not, however, distinguish itself from the sibling list_databases or explain its relationship to schema_explorer_tables, so an agent still has to infer which lister to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the Schema Explorer app' implies this is the entry point to the schema_explorer_* family, which is weak but real usage context. There is no explicit when-to-use / when-not-to-use statement and no mention of the alternative list_databases tool, so routing between the two remains ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_previewBRead-only
First rows of a table or view, for the Schema Explorer app.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| table | Yes | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's burden is lighter. It adds the useful fact that output is a limited 'first rows' sample, but says nothing about how the limit is enforced, whether it can be slow on large tables, or what the returned rows look like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the essential operation comes first with no preamble or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A three-parameter tool with 0% schema coverage and no output schema needs the description to explain database/table/limit semantics and the shape of returned rows. The description is silent on all three parameters, leaving an agent to guess at argument meaning and result format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden and it largely fails. 'table or view' loosely hints at the table argument, but database and limit are never explained, and the default-50 limit is left for the agent to infer from the word 'first'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'First rows of a table or view' clearly conveys the resource and the previewing operation, and 'for the Schema Explorer app' situates it. It stops short of distinguishing it from near-siblings like query_grid_rows, schema_explorer_table, or run_sql, which an agent could easily 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this preview versus run_sql, query_grid, or schema_explorer_table. The only hint is the app-scoping clause, which implies but does not state usage conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_skewARead-only
Data skew, for the Schema Explorer's Distribution tab / database "Check skew": rows and data per partition and per leaf, skew % (relative standard deviation and (max - avg) / avg), the largest partitions, the shard key and a plain explanation. Read-only (TABLE_STATISTICS, COLUMNAR_SEGMENTS).
Args:
database: Database (case-sensitive).
table: One table (case-sensitive); omit for every table of the database.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares readOnlyHint=true, and the description reinforces this while adding concrete provenance (TABLE_STATISTICS, COLUMNAR_SEGMENTS) an agent cannot get from annotations. It also previews the returned metrics, going beyond the safety flag without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, then parameters are listed under a clear Args header. The opening sentence is dense but every clause maps to a real output field, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the job of describing what is returned (rows, data, skew %, largest partitions, shard key, explanation), and it does so thoroughly enough for an agent to decide and invoke. Only the explicit sibling-relationship guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning and it largely does: both database and table are flagged case-sensitive, and table's optional/omit-for-every-table semantics are explained. This compensates well for the empty schema, though it does not restate defaults explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific analysis (data skew) and enumerates exactly what it reports: rows/data per partition and per leaf, skew %, largest partitions, shard key, and a plain explanation. It is clearly a distinct schema_explorer capability, though it does not explicitly contrast itself with siblings like schema_explorer_table or schema_explorer_analyze.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It locates the tool ("Schema Explorer's Distribution tab / database 'Check skew'") and gives the omit-table-for-all-tables rule, which is useful invocation context. However, there is no explicit when-to-use vs alternative guidance relative to the many sibling schema_explorer tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_tableBRead-only
Columns, keys, DDL and stats of one table, for the Schema Explorer app.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | ||
| database | Yes |
TDQS
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 usefully discloses what comes back (columns, keys, DDL, stats), which matters because there is no output schema, but it says nothing about behavior on missing tables or invalid database names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight phrase with zero filler, and the payload contents are front-loaded before the app qualifier. It is a fragment rather than a sentence, which slightly reduces clarity but wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, listing the returned artifacts is enough to call it correctly, and annotations cover safety. However, the absence of any guidance versus describe_table and the total silence on parameter meaning leave real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both required parameters (database, table) have 0% schema description coverage, and the description does not compensate at all — it never explains whether names are qualified, case-sensitive, or how the database relates to the table. The names are self-evident, which prevents a 1, but no added meaning is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (one table) and enumerates the returned artifacts (columns, keys, DDL, stats), so an agent knows exactly what data this yields. It does not differentiate itself from the near-identical sibling describe_table, which also appears to describe a single table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as describe_table or schema_explorer_tables. The only context is the phrase 'for the Schema Explorer app', which names a scope but does not tell the agent when to pick this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schema_explorer_tablesBRead-only
Tables and views of one database with storage type, rows and size, for the Schema Explorer app.
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read, so the bar is lower. The description usefully adds that results include storage type, row counts and size, but says nothing about pagination, result limits, or behavior for an unknown/inaccessible database name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource comes first and the returned attributes follow. It is efficient, though the trailing 'for the Schema Explorer app' is context an agent can do little with.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool this is roughly adequate: the description covers what is returned, which matters since there is no output schema. It falls short on how to identify the database and whether results are bounded or paginated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter and 0% schema description coverage, the schema itself provides no meaning for 'database'. The description only implies that the value selects one database ('of one database'), adding minimal semantics; it does not specify name format, case sensitivity, or whether an ID or display name is expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource (tables and views of one database) and enumerates the attributes returned (storage type, rows, size), so an agent knows exactly what it produces. It does not, however, distinguish itself from near-neighbors like list_tables or schema_explorer_table, leaving the agent to guess which listing tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool, when not to, or which sibling to prefer (list_tables vs schema_explorer_table vs schema_explorer_databases). The 'Schema Explorer app' phrase hints at a UI context but gives no actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
securitySecurityARead-only
Open the Security view of the SingleStore cluster (read-only).
Tabs: "users" (every user with type, lock status, password age and expiry, default resource pool, groups,
connections and risk flags such as ALL/SUPER on *.*, host '%', password never expires, locked, unused),
"roles" (user -> group -> role -> privileges, and "who can access" a database or table) and "pools"
(resource pool limits and live status, the workload manager queue with the limit each queued query waits
for, and which users use which pool). Nothing is changed: where a change would help, the view shows SQL
the user can copy.
The result includes ``browser_url``, which opens this view full-window in the user's browser: post it
as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | users |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=true, and the description adds real context beyond that: 'Nothing is changed: where a change would help, the view shows SQL the user can copy', plus the fact that results include browser_url and should be posted as a link under the app. Minor gap: the description omits any behavior for the 'audit' tab that the schema exposes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and read-only status, then tab-by-tab detail, then the browser_url handling instruction. The parenthetical tab detail is dense but every clause adds decision-relevant content; only slight trimming would be possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 return-value burden by naming browser_url and its intended presentation. Content per tab is well covered for three of four tabs, but the 'audit' tab is left undefined, leaving an enum value the agent cannot explain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'tab' parameter's enum values are opaque on their own, so the description does heavy lifting by explaining what the users, roles, and pools tabs contain (risk flags, privilege chains, pool limits/queue). It fails to describe the fourth enum value, 'audit', which is a notable omission given security_audit exists as a sibling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Open the Security view of the SingleStore cluster (read-only)', plus tab-level scope. It is clear this is a view-opening tool rather than a data-query tool, though it never explicitly distinguishes itself from close siblings such as security_users, security_roles, security_pools, or security_audit, which cover the same ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description explains what the view contains and that changes surface as copyable SQL, which hints at when a human-facing view is preferable to a data tool. There is no explicit when-to-use-vs-alternative guidance, even though many siblings (security_users, who_can_access, resource_pool_status) overlap with these tabs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_admin_capabilitiesBRead-only
What the connected user may change in the Security view (and why not), plus the privilege and pool-setting lists for the pickers. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so 'Read-only' is redundant, but the description does add useful behavioral context: it explains the tool answers what the user may change and why not, and returns picker lists. It stops short of describing response shape or how 'why not' is expressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the primary purpose before the ancillary picker-list content. The trailing 'for the pickers' clause is slightly cryptic but does not bloat the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only place to convey return content, and it does so only at a high level. For a read-only, no-param capability tool it is adequate, but the exact relationship to sibling security tools (e.g. security_change_plan) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters with a fully covered schema, so there is nothing for the description to disambiguate; the baseline of 4 applies. No syntax or format concerns exist for a parameterless call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (Security view capabilities for the connected user) and the specific content returned: change permissions with reasons, plus privilege and pool-setting lists. It is distinguishable from the mutation siblings (security_change_plan/script/apply) and from security/who_can_access, though the phrasing is noun-heavy rather than a clean verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It labels itself 'Read-only' but gives no explicit when-to-use condition or routing against the many security_* siblings (security, security_change_plan, security_who, user_privileges). The agent must infer that this is the capability-discovery call versus the plan/apply or listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_auditBRead-only
Audit tab data: audit log settings and how to turn audit logging on. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description merely repeats 'Read-only' without adding behavioral context such as what data is returned, whether any permissions are required, or how enabling audit logging is represented. With annotations covering the safety profile, the description adds little beyond redundancy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no waste, and the read-only note is kept brief at the end. It is appropriately sized for a zero-parameter informational tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with no parameters and no output schema, the description gives a minimal but adequate indication of what is returned: audit log settings and how to turn audit logging on. However, it does not describe the shape of the returned information, so an agent still has to call the tool to discover its output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics for the description to clarify. The baseline score of 4 applies, and no additional meaning is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (audit log settings and how to turn audit logging on), but the opening phrase 'Audit tab data' is vague and does not clearly distinguish this tool from siblings like security, security_admin_capabilities, or security_change_plan. An agent can infer it is an audit-information tool, but the scope is not precisely nailed down.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The phrase 'Read-only' is a safety note, not usage guidance, and no sibling tool is named or contrasted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_change_applyADestructive
Run one previewed change (users, roles, groups, grants, resource pools) on the cluster.
Refuses unless ``confirm`` is true: call it only after the user saw the plan (security_change_plan) and
explicitly confirmed. Where the plan asks for it (DROP, revoke all, the connected user or an admin user),
``typed_confirmation`` must be the name the user typed. The plan is rebuilt from fresh cluster state first,
and blockers (lock-out, last admin) refuse the change. ``password`` (create_user only) is sent as a bound
parameter and never returned, logged or stored.
Args:
action: The same action object as for security_change_plan.
confirm: Must be true: the user's explicit confirmation.
typed_confirmation: The object name the user typed, when the plan requires it.
password: The new user's password (create_user only).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| confirm | No | ||
| password | No | ||
| typed_confirmation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, but the description goes well beyond them: it discloses the confirm gate, the typed_confirmation safety valve for DROP/revoke-all/admin targets, that the plan is rebuilt from fresh cluster state, that lock-out/last-admin blockers refuse the change, and that password is bound, never returned/logged/stored. This is far richer than the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool does and its hard refusal gate, followed by behavioral caveats and a tight Args block. With 0% schema coverage the Args section carries real weight rather than repeating structured fields; no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers permissions implied by confirm, blocker refusal behavior, and secret handling, which is what an agent needs to invoke it safely. It does not describe the success/return payload, a minor omission given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the nested action object is opaque, but the description supplies meaning for confirm (must be true), typed_confirmation (the exact name the user typed, only when the plan requires it), and password (create_user only, never persisted). The action object's internal shape is only deferred to security_change_plan, which is reasonable but leaves a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (run/apply) and resource (one previewed security change covering users, roles, groups, grants, resource pools) on the cluster. The sibling security_change_plan is named explicitly, so an agent can separate the preview step from the apply step 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition chain: call only after the user has seen the plan via security_change_plan and explicitly confirmed; refuses unless confirm is true; typed_confirmation required only when the plan asks for it. When-to-use and when-not-to-use are both stated, with the alternative sibling identified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_change_planARead-only
Read-only preview of one change: the exact statements (any password masked), warnings, blockers (lock-out,
last admin, missing objects) and whether the user must type the object's name to confirm. Runs nothing.
Works without the change privileges (allowed says whether the connected user may run it).
Args:
action: {"action": one of create_user, drop_user, grant, revoke, revoke_all, create_role, drop_role,
create_group, drop_group, grant_role, revoke_role, grant_group, revoke_group, create_pool, alter_pool,
drop_pool, set_default_pool, grant_pool, revoke_pool, plus its fields: user, host, role, group,
grantee_type ("user"/"role"), privileges, database, table, with_grant_option, grant_option, pool,
settings, default_pool}. Never a password.
pending: The changes already in the script basket (same shape), for a change that needs objects they
create (the plan then says ``needs_script``).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| pending | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only assert readOnlyHint=true, but the description adds substantial behavior beyond that: passwords are masked, warnings and blockers (lock-out, last admin, missing objects) are surfaced, nothing is executed, it functions without change privileges, and the ``allowed`` flag indicates authorization. This is rich disclosure consistent with, not contradicting, the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior (preview, masks, blockers, confirm requirement) before the args detail, and every sentence earns its place given 0% schema coverage. The long enumeration of action values is necessary but heavy, keeping it just below maximum conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey the return shape, and it does: exact statements, warnings, blockers, the confirm-by-name requirement, the ``allowed`` flag, and the ``needs_script`` signal. Combined with thorough parameter documentation, nothing needed to call or interpret it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and both params are nested free-form objects, so the description carries the full burden and does: it enumerates all 19 action values, lists the action fields (user, host, role, group, grantee_type, privileges, database, table, with/without grant option, pool, settings, default_pool), specifies grantee_type values, and explains ``pending`` semantics including the ``needs_script`` outcome. Far more than the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: a read-only preview/dry-run of one security change. "Runs nothing" and "preview" clearly separate it from security_change_apply (which executes) and security_change_script (which emits a script), even without naming them. An agent can tell exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it previews a single change, works without change privileges, and reports whether the user may run it, which frames its use as a pre-flight check before applying. It stops short of explicitly naming the apply/script siblings or stating exclusions, so it lacks the explicit when-not guidance a 5 requires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_change_scriptARead-only
Read-only: one or more changes as a SQL script for review (e.g. by a DBA), instead of running them. The
statements are what Run would execute, rebuilt from the cluster state now (each change checked as if the
earlier ones had run), in a safe order (creates, grants, revokes, drops) unless keep_order, with a header
(connection, connected user, time, one line per change) and each change's warnings as -- WARNING:
comments. Runs nothing and needs none of the change privileges. Never takes or writes a password: CREATE USER
gets IDENTIFIED BY '<set password>' to fill in.
Args:
actions: The changes, each the same object as for security_change_plan.
keep_order: Keep the given order instead of the safe order.
| Name | Required | Description | Default |
|---|---|---|---|
| actions | Yes | ||
| keep_order | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description goes well beyond that: safe statement ordering (creates, grants, revokes, drops) unless keep_order, header contents, warnings emitted as '-- WARNING:' comments, no privileges required, and password handling (placeholder '<set password>'). This is exactly the kind of behavioral context the annotation 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The read-only/for-review framing is front-loaded and every sentence adds a distinct behavioral fact. It is dense with parentheticals and backticked literals, which is slightly heavy, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only a readOnlyHint annotation, the description carries the full burden and does so: it explains what is produced (a script with a header and warning comments), what it does not do (run anything, take privileges, handle passwords), and the ordering behavior. An agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: 'actions' is defined as the same object used for security_change_plan, and 'keep_order' is explained as keeping the given order rather than the safe order. The internal shape of each action object is still left to the sibling tool, so it is helpful but not fully self-contained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource+scope: 'one or more changes as a SQL script for review... instead of running them.' It explicitly differentiates itself from execution siblings via 'The statements are what Run would execute' and 'Runs nothing,' so an agent can distinguish it from security_change_apply/security_change_plan 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly frames the use case (produce a script for DBA review rather than execute) and cites the alternative by name ('the same object as for security_change_plan'). It stops short of naming security_change_apply directly or stating explicit when-not conditions for all siblings, 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.
security_poolsCRead-only
Resource pools tab data (with the per-pool history kept while the view refreshes).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes this is a safe read. The description adds a small amount of context with 'per-pool history kept while the view refreshes,' hinting at refresh/staleness behavior, but it is cryptic and does not clarify what is cached or how fresh the data is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence, so it is not bloated, but it is not front-loaded with a verb or a clear subject and the parenthetical is hard to parse. The brevity comes at the cost of clarity rather than from disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 burden of explaining what data comes back, and it does not: 'tab data' does not tell an agent what fields, pool attributes, or history entries to expect. For a read-only data-fetch tool, this leaves the agent guessing about the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to document and the baseline is 4. The description appropriately does not invent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says 'Resource pools tab data,' which names the resource but supplies no verb and no clear statement of what the tool actually returns or does. It reads like a UI tab label rather than a tool purpose, and it does not distinguish itself from siblings such as resource_pool_status or security.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives like resource_pool_status. The parenthetical about history is a data-behavior note, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_rolesBRead-only
Roles & groups tab data for the Security view.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description's main addition is scoping the data to the Roles & groups tab of the Security view. It says nothing about permissions required, volume of data returned, or any pagination/refresh behavior, so it adds only modest context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the key noun (Roles & groups / Security view) front-loaded. It is efficient, though its brevity shades into under-specification rather than pure economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param read tool with no output schema, the description should at least characterize what comes back (e.g., role/group names with member counts). It identifies the data domain but not the shape or scope of the return, leaving a gap an agent cannot fill elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; per the rubric a 0-parameter tool baselines at 4. The description correctly implies a no-argument fetch.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (roles & groups data) and its location (Security view tab), which loosely distinguishes it from siblings like security_users, security_tables, and security_pools. However, it uses a noun phrase rather than a verb ("Roles & groups tab data"), leaving the action — presumably returning that dataset — implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to call this versus the adjacent security_* siblings (security_users, security_tables, security_pools, security). An agent must infer selection purely from the resource name, with no prerequisites or exclusions given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_tablesCRead-only
Tables of one database, for the "who can access" picker.
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe read, so the description carries a lower bar, but it still discloses nothing beyond that: no return shape, no pagination or result-limit behavior, no scoping rules. The only extra signal, 'of one database', is already implied by the single 'database' parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence fragment with no filler — nothing redundant to trim. It is terse to the point of under-specification, but that is a completeness problem rather than a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool the annotation covers safety, but the description leaves the agent unable to route between this, list_tables, and schema_explorer_tables, and provides no output or scoping detail. Against a crowded security/schema sibling set, that is inadequate context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 0%, so the description must compensate. 'Of one database' does clarify that the result set is scoped by the database argument, which is modest added value, but it says nothing about accepted identifier format, defaults, or whether the database must exist in the current connection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Tables of one database' does convey the resource returned, but it is a bare noun phrase with no verb and no distinguishing detail. It does not differentiate itself from siblings like list_tables or schema_explorer_tables, so an agent cannot tell why it would pick this one over those 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'For the "who can access" picker' gives an implied usage context that links it loosely to the who_can_access/security family. However, it never states when to use this versus list_tables or schema_explorer_tables, and offers no exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_user_detailCRead-only
Effective privileges of one user, for the Users tab.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| user | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a read-only operation, and the description does not contradict it. However, it adds no behavioral detail beyond that annotation—no auth requirements, return format, pagination, or rate limits. It is safe but sparse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and contains no filler, but it is a sentence fragment rather than a structured, front-loaded explanation. Its brevity comes at the cost of clarity for a tool with two required parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read-only operation with no output schema, so the description need not explain return values. Still, it leaves the required host parameter unexplained and provides no usage context, making it incomplete for an agent to invoke confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for two required parameters. It only vaguely references 'one user' and never explains the 'host' parameter, leaving both parameters essentially undocumented. No format or meaning is provided beyond parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (effective privileges of one user) but omits a verb and does not distinguish this tool from sibling tools such as user_privileges or security_users. The 'for the Users tab' clause adds UI context rather than functional clarity. It is usable but vague enough that an agent must infer the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives like user_privileges or who_can_access. The only context, 'for the Users tab,' implies a UI location, not a selection condition. There are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_usersCRead-only
Users tab data for the Security view.
| Name | Required | Description | Default |
|---|---|---|---|
| unused_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds no behavioral context beyond that, such as what 'Users tab data' includes, how unused_days affects results, or whether results are paginated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no structural waste, but it is under-specified rather than appropriately concise. It fails to front-load meaningful information about the tool's purpose or parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one optional parameter and no output schema, the definition is still incomplete. It does not explain the unused_days filter, what user data is returned, or how this differs from sibling security tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single unused_days parameter. The description never mentions it, so it does not compensate for the low coverage; the parameter title and default in the schema provide only minimal meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Users tab data for the Security view' does not state a specific verb or what the tool does with user data. It partly restates the tool name and fails to distinguish it from numerous security siblings such as security_user_detail, security_who, and user_privileges.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The agent is left to infer its role among many security-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
security_whoCRead-only
Reverse lookup ("who can access") for the Roles & groups tab.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe, non-mutating call, so the description would need to add something beyond that to earn credit. It adds nothing about what is returned (users, roles, groups?), whether results are paginated or capped, or the cost of the lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence, so it is certainly not bloated, but half of it is spent on the UI location 'Roles & groups tab' rather than on behavior an agent can act on. Briefness here reflects omission rather than disciplined editing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, no schema descriptions, and only a single readOnly annotation, the description should carry the burden of scope and parameter meaning. Instead it supplies a UI reference and a restatement of the name, leaving the agent unable to predict arguments or results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across both parameters, so the description must compensate and does not: neither 'database' (required) nor the optional 'table' is named or explained. At best 'reverse lookup' faintly implies the arguments identify the protected object, but the difference between supplying a database alone versus a database plus table is left entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Reverse lookup ("who can access")' conveys the general idea of resolving access from an object back to principals, but it never states what resource is being resolved (table? database? role?) nor what the output represents. It also fails to distinguish itself from the near-identical sibling who_can_access, which appears to promise the same thing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives. The most obvious alternative, the sibling tool who_can_access, is never referenced or differentiated, leaving the agent to guess which of the two to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editorSingleStore WorkspaceARead-only
Open the SingleStore workspace: an interactive SQL editor plus views.
A slim rail on the left switches between the SQL Editor (schema tree,
editor with autocomplete for keywords, SingleStore functions, databases,
tables and columns, and a results pane), the Schema Explorer, the Pipeline
Monitor and the Cluster Monitor. Use this when the user wants to write,
edit or run SQL themselves, or wants the combined workspace. To run a
query for your own reasoning use run_sql; to show results use query_grid.
The editor has a chat panel: questions from it arrive in the conversation
tagged "[SQL Editor <id>]"; answer those with sql_editor_reply.
The editor has tabs; `sql` goes into the active tab, below the user's
text (or into a new tab with new_tab=true).
The result includes ``browser_url``, which opens this view full-window in
the user's browser: post it as a clickable link right under the app.
Args:
database: Database to start in (case-sensitive).
sql: SQL to put in the editor (not run automatically).
view: View to show first: "sql" (default), "notebook", "schema", "pipelines", "cluster", "history" (Query History), "alerts", "workload" or "connections".
table: For view="schema": table to pre-select in `database`.
new_tab: With `sql`: open it in a new editor tab instead of the active one.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | ||
| view | No | sql | |
| table | No | ||
| new_tab | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering safety, the description adds real context beyond annotations: it discloses that the result contains browser_url and instructs the agent to post it as a clickable link, that SQL is not run automatically, and how inbound chat questions are tagged and answered. It is not exhaustive about every view's behavior, but it clearly exceeds what the annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and routing decision before any detail, and every paragraph carries information (views, sibling routing, chat tagging, browser_url, Args). It is longer than strictly necessary – the rail enumeration and chat-panel paragraph could be tightened – but nothing is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with no output schema and no annotation beyond readOnlyHint, the description supplies purpose, siblings, prerequisites (SQL is not executed), parameter semantics, and the one return value worth acting on (browser_url). An agent has everything needed to call and present the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the Args block carries the full burden and does so thoroughly: database is flagged case-sensitive, sql is marked 'not run automatically', table is scoped to view="schema", new_tab's interaction with sql is explained, and the admissible view values are enumerated even though the schema declares no enum. Without this text four of five parameters would be ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open the SingleStore workspace: an interactive SQL editor plus views') and then enumerates exactly what the workspace contains (schema tree, editor, results pane, rail views). It is immediately distinguishable from siblings such as run_sql, query_grid and schema_explorer, which are named in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('when the user wants to write, edit or run SQL themselves, or wants the combined workspace') and names the alternatives with their selecting conditions ('To run a query for your own reasoning use run_sql; to show results use query_grid'). The chat-panel routing to sql_editor_reply is a further concrete 'when' case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_askCRead-only
Answer a SQL Editor chat question in the app; the reply arrives in the editor's inbox.
``profile`` picks speed vs depth: "fast", "balanced" (default) or "thorough".
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | ||
| profile | No | ||
| database | No | ||
| question | Yes | ||
| selected | No | ||
| editor_id | Yes | ||
| last_result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile. The description adds a genuinely useful behavioral detail: the reply is delivered asynchronously to the editor's inbox rather than returned inline. Beyond that it says nothing about auth, latency, or lifecycle, so it is only modestly additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core purpose front-loaded and no wasted wording. Efficiently sized, though the profile sentence is somewhat loosely attached.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with zero schema coverage, no output schema, and minimal annotations, the description explains almost none of the inputs (only 'profile') and does not describe what the caller receives. The async inbox pointer helps but does not close the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description carries the full burden. It only explains one parameter ('profile' with fast/balanced/thorough), leaving sql, database, question, selected, editor_id, and last_result completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Answer a SQL Editor chat question') and clarifies the delivery channel ('reply arrives in the editor's inbox'). It is clear what the tool does, but it does not differentiate itself from close siblings such as sql_editor_assistant, sql_editor_inbox, or notebook_ask.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use / when-not guidance and no routing to alternatives among the many sibling ask/assistant/inbox tools. The only conditional guidance concerns the 'profile' parameter, not tool selection, so the agent is left to infer when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_ask_cancelBRead-only
Stop the in-app answer that is running for one SQL Editor.
| Name | Required | Description | Default |
|---|---|---|---|
| editor_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, which gives the agent a safety signal, but cancelling an in-flight generation does change server-side process state, so the hint is at least in tension with the tool's behavior and the description does nothing to clarify it. It also omits what happens on cancel (partial answer retained? error raised? idempotent if already finished?).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action verb first and no filler; nothing is wasted. It is efficient but so terse that the brevity shades into under-specification rather than crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter control tool with no output schema, the description covers the basic intent. It is still missing the id's origin, behavior when no answer is running, and any differentiation from the other two cancel tools, which is material given this crowded sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — editor_id carries only a bare title — so the description is the only source of parameter meaning, and it adds almost none. Saying "one SQL Editor" hints that the parameter identifies an editor but gives no format, source, or how to obtain the id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Stop") and resource ("the in-app answer that is running") scoped to a single SQL Editor, so an agent can tell it is a cancellation tool rather than a query or answer tool. It falls short of 5 because it never names its counterpart sql_editor_ask, leaving the pairing implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "that is running" implies the usage condition (an answer is in flight) but never states it as a rule or says what to do if nothing is running. With three cancel-shaped siblings in the list (sql_editor_ask_cancel, query_history_ask_cancel, query_history_compare_cancel), the description relies on "SQL Editor" alone to disambiguate the domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_assistantCRead-only
Whether the SQL Editor can answer questions in the app (Claude Code installed).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating call, so the description needs to add operational context it does not: what the check actually returns, whether it is cheap or triggers a subprocess/install detection, or whether it caches. The parenthetical hints at an environment dependency but never explains the resulting behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no padding, so nothing needs trimming. It is slightly under-specified rather than bloated, and the fragment phrasing is terse but front-loads the subject.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 convey what the caller gets back (a boolean? a status object?) and does not. For a capability check whose result determines whether the agent should attempt sql_editor_ask, this leaves the core contract unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. No parameter meaning is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the subject (SQL Editor's ability to answer questions) but is phrased as a noun clause rather than a verb+resource statement, so it never says this is a status/availability check. It is distinguishable from siblings only by inference, and the parenthetical '(Claude Code installed)' is ambiguous about whether it is a cause, condition, or dependency.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus sql_editor_assistant_warm, sql_editor_ask, or sql_editor_reply. The agent is left to guess whether this is a precondition check, a health probe, or a capability query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_assistant_warmARead-only
Start the editor's assistant process ahead of the first question (no model call).
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | ||
| editor_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this operation does not mutate user data. The description adds useful behavioral context by clarifying that no model call occurs, but does not explain what warming entails, whether editor_id must reference an existing editor, or any latency/initialization side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action and followed by the key timing and no-model-call qualifiers. No words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter warm-up tool with a readOnlyHint and no output schema, the description covers the essential action and timing. However, it leaves the optional profile parameter and the required editor_id semantics unexplained, which is a notable gap for an agent invoking it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning, and it does not. It never mentions editor_id or profile; only the property name 'editor_id' and the resource phrase 'editor's assistant' make the required parameter minimally inferable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: starting the SQL editor's assistant process, with the temporal qualifier 'ahead of the first question' and the behavioral note 'no model call.' It clearly distinguishes a warm-up call from an actual question call by implication, but does not explicitly name the sibling sql_editor_assistant as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: call this before the first question to warm the assistant. It does not state when not to use it or explicitly contrast it with sql_editor_assistant, but the intended timing is clear enough for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_classifyARead-only
Which of these statements need the user's confirmation (change data or schema), for "Run all".
Same check as sql_editor_query, without running anything.
| Name | Required | Description | Default |
|---|---|---|---|
| statements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the non-mutating nature, and the description reinforces it with 'without running anything.' However, it defines its own behavior only by reference to another tool ('Same check as sql_editor_query'), giving no detail on return shape or classification criteria beyond 'change data 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core purpose is front-loaded before the comparison to the sibling tool. Slightly hampered by referencing another tool's behavior instead of stating its own outright.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter classification tool with no output schema, the description should describe what it returns (e.g., which statements flagged, or a classification structure). It only implies this via the opening question, leaving the result format unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema supplies no meaning for the sole 'statements' array parameter. The description's 'Which of these statements' implies the input is a list of SQL statements to classify, adding some meaning, but gives no format, size, or batching details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific function: determining which statements require user confirmation because they change data or schema. It distinguishes itself from the sibling sql_editor_query by clarifying it performs the same check 'without running anything.' The name sql_editor_classify is opaque, but the description rescues it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It ties usage to a concrete workflow ('for "Run all"') and explicitly names the related alternative (sql_editor_query), explaining that this variant does the check without execution. It gives clear context but does not spell out explicit when-not conditions beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_executeBDestructive
Run any single statement the user confirmed in the SQL Editor app (writes and DDL included).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| tab | No | ||
| file | No | ||
| tab_id | No | ||
| database | No | ||
| max_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered; 'writes and DDL included' partly restates that. The genuinely new context is the single-statement limit and the user-confirmation precondition, but nothing is said about transaction/commit behavior, permissions, or error handling for a destructive mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence, front-loaded with the verb and free of padding. It is appropriately sized for its scope, though briefly stating the max_rows/database defaults would have been low-cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter destructive tool with no output schema and zero schema coverage, one sentence is insufficient. An agent gets no guidance on tab/file/database targeting or the max_rows default, even though annotations at least carry the safety signal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and none of the six parameters (tab, file, tab_id, database, max_rows) are explained in the description. Only 'single statement' loosely touches the sql parameter; the other five are left entirely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Run') and resource ('any single statement'), plus scope ('writes and DDL included') and context ('the SQL Editor app'). However, it does not distinguish itself from near-name siblings like sql_editor_query or the top-level run_sql, so an agent must infer which execution path applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Single statement' and 'the user confirmed' imply when to use it, giving an implicit constraint (one statement at a time, already approved). But no alternative is named and no when-not guidance is given, leaving the many sibling execute/query tools un-disambiguated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_filesBRead-only
The .sql files in the SQL Editor's folder, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds one genuine behavioral trait beyond the annotations: results are ordered newest first. It says nothing else notable (no filtering, pagination, or scope limits), so a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the ordering detail is placed at the end where it is easy to skim. It is a noun phrase rather than a verb-led sentence, which is slightly less front-loaded than ideal but wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with no output schema, the description covers what the result set is and how it is ordered, which is enough to invoke it correctly. A note on scope (all .sql files vs. only the user's) or a pointer to a sibling for other file types would have made it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. The description correctly implies no arguments are needed by describing a bare folder listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the .sql files in the SQL Editor's folder) and an ordering guarantee, so an agent knows exactly what comes back. It does not differentiate itself from near-siblings such as files_browse, notebook_files, or sql_editor_inbox, leaving ambiguity about which listing tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no prerequisites, and no mention of alternatives despite several overlapping listing tools in the sibling set. The 'SQL Editor's folder' phrase implies context but does not route the agent explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_historyARead-only
The SQL Editor's run history, newest first (SQL cut to a preview; full text with sql_editor_history_entry).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | ||
| before_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely useful behavioral context beyond that: results are ordered newest first and SQL text is truncated to a preview, which warns the agent not to expect full statements. It stops short of covering pagination or rate/limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the resource, the ordering, and the truncation caveat, then routing to the sibling. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It adequately covers return format (preview text), ordering, and the route to full text, which matters since there is no output schema. But with three undocumented parameters and no pagination guidance, an agent cannot reliably filter or page, leaving the definition materially incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, yet it mentions none of limit, search, or before_id. In particular before_id is a pagination cursor whose semantics (fetch entries older than this id) are entirely unstated, which is a real gap for an agent trying to page through history.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (SQL Editor run history) and a meaningful property (newest first), and explicitly distinguishes itself from sql_editor_history_entry for full text. It lacks an explicit verb like 'list', but the resource and ordering are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical implies when to use the sibling ('full text with sql_editor_history_entry'), so there is partial routing guidance. However, it never says when to use this tool over other history siblings like query_history or query_history_data, nor does it state prerequisites, leaving selection largely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_history_clearB
Empty the SQL Editor's run history.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The word 'Empty' signals permanent deletion of history data, which sits uneasily with destructiveHint=false; the description discloses nothing about reversibility, scope (all history vs. one workspace), or whether the operation can be undone. readOnlyHint=false is consistent with a mutating tool, so the contradiction is partial rather than total.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is appropriately short for a zero-argument tool, though that brevity is exactly why neither scope nor irreversibility is covered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a data-deleting tool with no annotations covering reversibility and no output schema, the description should state scope and whether the action is permanent. As written, an agent cannot tell the blast radius of calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema baseline of 4 applies and there is nothing further the description could reasonably add about arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Empty') plus specific resource ('the SQL Editor's run history') makes the action unambiguous. It does not, however, distinguish itself from siblings such as sql_editor_history or query_history, nor clarify whether it clears all history or just the current session's.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when this tool should be invoked versus the read-oriented sql_editor_history / query_history siblings, and no warning about irreversibility or confirmation requirements. The agent gets the what but not the when or the caution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_history_entryCRead-only
One statement from the SQL Editor's run history, with its full SQL.
| Name | Required | Description | Default |
|---|---|---|---|
| entry_id | Yes |
TDQS
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 only that the entry's SQL is included; it says nothing about behavior when entry_id is invalid, whether results can be empty, or any other trait beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no waste and the core content front-loaded. It is appropriately sized for a simple getter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, this is minimally adequate. It conveys what is returned but leaves the required entry_id semantics and any failure behavior unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the single required parameter entry_id is undocumented in the structured data. The description implies it identifies the entry but gives no format, range, or provenance guidance to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (one statement from the SQL Editor's run history) and its payload (full SQL), which is enough to tell it apart from the sibling sql_editor_history list tool. It relies on an implied verb and does not explicitly state it fetches by id, but the scope is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of when to prefer this over sql_editor_history or query_history_event, and no prerequisites. The agent must infer usage purely from the noun phrase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_inboxBRead-only
Replies sent to one SQL Editor's chat panel, newer than after.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| editor_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile (non-mutating read) is covered. The description usefully adds the incremental-read behavior ('newer than after') and the single-editor scoping, but says nothing about ordering, result limits, or whether unread vs all replies are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the scope constraint front-loaded; no filler. The stray double-backtick around 'after' is a minor formatting blemish rather than wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description is minimally viable: it identifies what comes back and the filter. It still omits return shape/ordering and pagination expectations, which an agent needs to poll correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the load. It explains 'after' (only replies newer than this value) and implies editor_id selects the chat panel, but adds no detail on type/format (e.g., timestamp vs message id) or the default-0 behavior implied by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ('replies sent to one SQL Editor's chat panel') and the scope filter ('newer than after'), which separates it from the write-side sibling sql_editor_reply. It is clear to an agent what content this tool surfaces, though the retrieval verb ('list'/'fetch') is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives such as sql_editor_reply (posting a reply) or sql_editor_ask. The agent must infer the polling/read-back use case entirely from the name and the 'after' filter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_open_fileARead-only
Read one .sql file from the SQL Editor's folder, or a file on SAS Viya.
``name``: a local file (relative to the SQL folder, or absolute), or a SAS Viya file ref
(``sas-content://<connection>/<path>`` or ``sas-server://<connection>/<path>``, see viya_files_browse);
a Viya file's result has its ``version`` (ETag), which sql_editor_save_file checks before overwriting.
``remember`` puts it on the Recent list (false when the editor only
re-reads its open file to compare it with the restored draft).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| remember | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint already declares this as a safe read operation. The description adds that Viya results include a version (ETag) checked by sql_editor_save_file before overwriting, and explains the Recent list effect of remember, including the specific false re-read comparison case. It omits error and permission behavior, but adds useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and source, then details parameters in two dense backtick-labeled clauses. Efficient and information-rich, though the long parentheticals and nested cross-references make it slightly harder to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only two-parameter tool with no output schema, the description covers source types, ETag/version behavior for Viya files, and the remember flag semantics. It omits authentication or Viya connection requirements and explicit return details beyond version, but is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It documents name as a local relative or absolute path or a SAS Viya URI scheme and remember as Recent list inclusion with the false re-read comparison case, fully compensating for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (.sql file), and scopes the source to the SQL Editor folder or SAS Viya. It references sibling viya_files_browse for file refs but does not explicitly distinguish this tool from sql_editor_files or files_browse, so sibling differentiation is partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context for the remember parameter and points to viya_files_browse for Viya paths, plus sql_editor_save_file for ETag checks. However, it does not say when to use this tool versus alternatives like sql_editor_files, viya_files_browse, or files_browse for listing or opening files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_queryARead-only
Run a read-only statement from the SQL Editor app, streaming its result.
Returns as soon as the first ``max_rows`` rows (the first page) are in, or the result is complete; the
rest keeps loading on the server (up to SINGLESTORE_MCP_EDITOR_MAX_ROWS, default 100,000 rows) and the
app pages through it with sql_editor_rows (``done`` / ``loaded`` give the progress and the total).
``stream_id`` is chosen by the app, so its Stop (sql_editor_stop) works before this call returns;
``replaces``: the tab's previous result, dropped. Statements that change data or schema are answered
with ``needs_confirmation`` instead of running; the app then asks the user and uses
sql_editor_execute. Every run lands in the editor's history (when it has finished), with the tab
(``tab_id``, its label ``tab``) and open ``file`` it ran from.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| tab | No | ||
| file | No | ||
| tab_id | No | ||
| database | No | ||
| max_rows | No | ||
| replaces | No | ||
| stream_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already declared, the description still adds substantial behavior beyond annotations: streaming returns at the first max_rows page, the server keeps loading up to SINGLESTORE_MCP_EDITOR_MAX_ROWS (default 100,000), stream_id is assigned by the app so Stop works mid-call, and replaces drops the tab's prior result. That is exactly the kind of non-obvious runtime context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, followed by well-organized details on streaming, paging, and routing. It is dense and long, but nearly every clause carries distinct operational information; only the parenthetical about tab label and file is marginally tautological.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-param, no-output-schema tool, the description covers the important return semantics (first page arrives, remainder pages via sql_editor_rows, done/loaded progress) and the read-only constraint. It does not explain the 'database' parameter or the shape of returned rows, which leaves minor gaps, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for most params: max_rows (first page size), stream_id (app-chosen, enables Stop), replaces (drops prior tab result), tab_id/tab (tab identity), and file (source file). Only 'database' is left entirely undefined, so it compensates well but not completely for the 8-param gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 statement from the SQL Editor app, streaming its result') and immediately distinguishes itself from siblings: it names sql_editor_execute for mutating statements, sql_editor_rows for paging, and sql_editor_stop for cancellation. An agent can tell what this does and what it is not 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes mutating statements elsewhere ('Statements that change data or schema are answered with needs_confirmation ... uses sql_editor_execute') and points to sql_editor_rows/sql_editor_stop for follow-up. It gives clear context for use, but does not state when to prefer this over other query entry points such as run_sql or sas_query, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_replyARead-only
Send an answer to the chat panel of an open SQL Editor app.
Use this to answer a message that arrived from the SQL Editor (it starts
with "[SQL Editor <editor_id>]") or the Workload view's chat ("[Workload
<id>]": each ```sql block gets Add to workload / Replace / Test buttons there,
optionally preceded by "-- name: …" and "-- per_minute: N" lines), or when the user asks you to put SQL into
their open editor (the editor reports its id in the model context). The
message is plain text; put SQL in ```sql fenced blocks - each block gets
Replace / Insert / Copy buttons in the editor. Keep explanations short.
After calling this, reply briefly in the chat as well.
Args:
editor_id: The editor's id, e.g. "e-4f9a2c".
message: The answer, with SQL in ```sql fenced blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| editor_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Send an answer' and describes creating a chat message, which is a write/side effect, while the annotations declare readOnlyHint=true. This contradicts the annotation's claim that the tool does not modify its environment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds necessary formatting guidance. It is somewhat verbose but every clause mostly earns its place by explaining message structure and post-call behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. The description covers purpose, when to use it, parameter expectations, and formatting behavior, leaving only minor gaps such as error handling or invalid editor_id behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains that editor_id is the editor's id (with an example format) and that message should be plain text with SQL in sql fenced blocks, adding useful semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Send an answer to the chat panel of an open SQL Editor app.' It distinguishes the tool from siblings by naming the exact incoming-message formats and the user request it responds to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers for when to use it: answering messages from SQL Editor or Workload chat, or when the user asks to put SQL into their open editor. It does not, however, state when not to use it or explicitly name an alternative sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_rowsARead-only
More rows of a streamed SQL Editor result (from sql_editor_query), from offset, plus its progress.
At most ``limit`` rows and about 2 MB per call. ``wait_ms``: wait up to this long for rows past
``offset`` (or the end) while the result is still loading, instead of polling.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| wait_ms | No | ||
| stream_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses operational limits ('at most limit rows and about 2 MB per call') and the wait_ms waiting semantics vs. polling. This is useful behavioral context that annotations don't carry, though it omits behavior when the stream is expired or unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose and origin tool, then the two operational facts that matter (size cap, wait behavior). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 hint at returns; 'plus its progress' signals that rows and progress metadata are returned. Combined with the size/limit guidance, this is nearly complete for a paginated streaming reader, though it could clarify progress/end-of-stream signaling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely does: it explains offset, limit, and wait_ms (including waiting past offset or to the end while loading). stream_id is only implied as the result handle from sql_editor_query, leaving one param underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('More rows of a streamed SQL Editor result') and names the originating sibling ('from sql_editor_query'), so an agent can immediately tell this is the pagination/continuation tool rather than a fresh query. Scope and paging intent are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context: use this to fetch rows past 'offset' of a result previously produced by sql_editor_query, and 'instead of polling' via wait_ms. It gives an alternative pattern for retrieval, though it doesn't explicitly state when-not-to-use or name a competing tool for the same data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_save_draftA
Autosave one SQL Editor tab's text, database and cursor (never writes the open .sql file itself).
``file_version``: for a file on SAS Viya, the version (ETag) the editor opened or last saved, so Save after
a restart still notices a newer version on the server.
``saved_hash`` is the editor's hash of the open file's last saved text, so a
restored draft knows whether it has unsaved changes; ``dirty`` says so for
the tab bar. ``origin``: the workload statement the tab was opened from
(``{"workload", "statement_id", "statement_name"}``), for "Update in workload".
``language``: what the tab runs as (singlestore, procsql, fedsql, cas); ``sas``: its SAS library / caslib
and PROC SQL options (outobs, noexec, feedback, pushdown).
``closed`` in the result: the tab was closed (elsewhere) and the text wasn't kept.
| Name | Required | Description | Default |
|---|---|---|---|
| sas | No | ||
| sql | Yes | ||
| head | No | ||
| dirty | No | ||
| anchor | No | ||
| origin | No | ||
| tab_id | No | ||
| database | No | ||
| language | No | singlestore | |
| file_name | No | ||
| file_path | No | ||
| saved_hash | No | ||
| file_version | No | ||
| file_external | No | ||
| continue_on_error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, and the description is consistent with that, adding that this is an autosave that deliberately does not touch the open file. It further discloses result behavior ('closed' means the tab was closed elsewhere and text was discarded), which is real context the annotations do 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first sentence and the parameter glosses are organized as discrete backtick-labeled items, avoiding wasted prose. Size is reasonable for a 15-parameter tool, though the parenthetical aside and escaped formatting make the opening slightly clunky.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 partially compensates by explaining the 'closed' result field. But with 15 parameters, no schema descriptions, and only safety annotations, several inputs (head/anchor cursor semantics, continue_on_error, file_external) are never covered, leaving the definition only partially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 15 parameters, so the description carries the burden and explains only file_version, saved_hash, dirty, origin, language, and sas. It leaves sql, head, anchor (the cursor fields referenced by the opening sentence), tab_id, database, file_name, file_path, file_external, and continue_on_error undefined, so a meaningful share of parameters remain opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Autosave one SQL Editor tab's text, database and cursor') and immediately scopes it against the sibling file-save operation with '(never writes the open .sql file itself)'. An agent can distinguish this from sql_editor_save_file 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical exclusion effectively says when NOT to reach for this tool (when you intend to persist the .sql file), implying the alternative path. However, it never names that alternative explicitly or states a positive triggering condition ('use this while editing, to checkpoint state'), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_save_fileB
Save the editor's SQL as a .sql file in the SQL Editor's folder, or to a file on SAS Viya.
An existing file is only replaced with ``overwrite``; otherwise the result
says ``exists`` so the app can ask first.
SAS Viya files (``name`` a ``sas-content://`` / ``sas-server://`` ref): ``expected_version`` is the version
(ETag) the editor opened; when the file on Viya is newer the result says ``conflict`` (nothing written) and
the app asks before saving with ``overwrite``. A ref of another SAS Viya connection than the active one
answers ``connection_mismatch``; ``use_active`` saves it to the same path on the active connection.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| name | Yes | ||
| overwrite | No | ||
| use_active | No | ||
| expected_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, but the description states that an existing file is replaced when overwrite is used, which is a destructive update. This directly contradicts the annotation, forcing a score of 1 under the rubric.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three short paragraphs, front-loading the core save action and then detailing overwrite and Viya-specific behavior. It is dense but every sentence conveys actionable behavior, with no obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a save operation spanning local folders and SAS Viya with version checks and connection mismatch, the description supplies status outcomes (exists, conflict, connection_mismatch) and parameter roles. No output schema is present, and no critical invocation detail appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden. It defines expected_version as the ETag the editor opened, overwrite as the condition for replacing an existing file, use_active as saving to the same path on the active connection, and name as a sas-content:// or sas-server:// reference for Viya files, adding substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (save) and resource (the editor's SQL as a .sql file), and distinguishes between saving in the SQL Editor's folder and saving to a SAS Viya file. It does not explicitly name or contrast with sibling tools like sql_editor_save_draft or sas_viya_save, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains behavioral scenarios such as overwrite, conflict, and connection mismatch, which imply usage context. However, it never states when to choose this tool over alternatives such as sql_editor_save_draft or sas_viya_save, so guidance remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_schemaBRead-only
Tables, columns and routines of one database, for the SQL Editor's tree and autocomplete.
| Name | Required | Description | Default |
|---|---|---|---|
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, but the description adds nothing behavioral beyond that – no note on result size, whether all objects are returned, latency, or caching. For a potentially large catalog read it discloses none of its operational traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though its brevity is partly the cause of the missing parameter and behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one param, read-only, no output schema), yet the description leaves the parameter format and the shape/size of the returned catalog undocumented. Adequate but with clear gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single required 'database' parameter has 0% schema description coverage, and the description only alludes to 'one database' without saying whether it takes a name, identifier, or connection-qualified reference. The description does not compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete deliverable – tables, columns and routines of one database – so an agent knows exactly what comes back. It does not, however, distinguish this from closely named siblings such as schema_explorer_tables, schema_explorer_table, list_tables or describe_table, and the SQL-Editor/tree framing is the only differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for the SQL Editor's tree and autocomplete' implies the intended use context, but there is no explicit when-to-use statement and no mention of alternatives like schema_explorer or describe_table. The agent must infer which schema-listing tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_stateBRead-only
One SQL Editor tab's saved draft (the active tab's by default), recent files and history size, for restoring it.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. Beyond that the description adds the default-to-active-tab behavior and enumerates the payload (draft, recent files, history size), which is useful and not in the annotations, but it says nothing about size limits, permissions, or how the state is scoped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the resource front-loaded and the default scope in parentheses. The trailing 'for restoring it' is slightly tacked-on but adds the purpose, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 the return payload, and it does name the three components (draft, recent files, history size). But against a 0%-coverage parameter and no output schema, the tab_id semantics and any structure of the returned state remain under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single tab_id parameter is an undocumented nullable string. The description compensates partially by explaining the default ('the active tab's by default'), but it never says how to obtain a tab_id or what format it takes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource returned — one SQL Editor tab's saved draft, recent files, and history size — which lets an agent distinguish it from siblings like sql_editor_tabs and sql_editor_history. However, it uses a noun phrase with no explicit retrieval verb ('get/read'), leaving the action slightly implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for restoring it' implies the use case (state persistence/restore), and '(the active tab's by default)' hints at default scoping. But it never states when to choose this over overlapping siblings such as sql_editor_tabs, sql_editor_history, or sql_editor_files, so the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_stopARead-only
Stop a SQL Editor query that is still running or loading rows (KILL QUERY on its own connection, after checking it still runs this statement). The rows read so far stay.
| Name | Required | Description | Default |
|---|---|---|---|
| stream_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, yet the description describes a state-changing operation (KILL QUERY). This is a contradiction: KILL QUERY inherently modifies server state, so readOnlyHint=true is misleading. However, the description itself provides useful behavioral detail: it checks that the connection still runs the statement, and notes that already-read rows remain. The contradiction is with annotations, not the description, but it affects transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense sentence that front-loads the action and constraints. No wasted words, and both the mechanism and side effect are stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool with only a readOnly annotation, the description covers the core behavior but omits how to obtain stream_id and does not address the annotation contradiction. Given no output schema, it should clarify whether the stop is synchronous and what is returned, but it is minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is one required parameter (stream_id). The description does not explain what stream_id represents or how to obtain it. Baseline for one param with no schema description is around 3, but the description adds no parameter meaning, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (stop) and resource (SQL Editor query), and clarifies scope: only queries 'still running or loading rows'. This distinguishes it from siblings like workload_stop or sas_session_reset, and the parenthetical clarifies the exact mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage (when a query is still running or loading rows), but no explicit 'when not to use' or alternatives named. Siblings such as sql_editor_state or sql_editor_query could be relevant but are not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tab_activateB
Remember which SQL Editor tab is active (it's the one that opens next time).
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the write-without-destruction profile is covered structurally. The description adds one genuinely useful behavioral fact: the setting persists and determines which tab opens next, which the annotations do not convey; it says nothing about failure modes for invalid tab ids.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the action; the parenthetical earns its place by stating the persistence effect. No padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so return values need no explanation, and the tool is simple. However, adequate coverage would at least point to where a valid tab_id comes from (e.g., sql_editor_tabs), which is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One required parameter at 0% schema description coverage, and the description never explains tab_id — where to obtain it, its format, or whether an unknown id errors. With a single undocumented parameter the description should carry the load and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific effect on a specific resource: it sets/remembers the active SQL Editor tab. The parenthetical clarifies the consequence ('the one that opens next time'), which separates it from sibling state readers like sql_editor_state and sql_editor_tabs. Only mild weakness is the informal verb 'remember' for what is a state mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no mention of alternatives such as sql_editor_state (to read the active tab) or sql_editor_tab_new/close/reorder. The agent must infer the calling context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tab_closeA
Close a SQL Editor tab and drop its draft (the open .sql file is untouched); the last tab is replaced by an empty one.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds genuine behavioral detail beyond them: the tab's draft is dropped, the underlying .sql file is untouched, and closing the last tab substitutes an empty tab. The draft loss is the key side effect an agent needs. A minor tension exists with destructiveHint=false since draft content is discarded, but this is a UI-level effect rather than destruction of a server resource, so it is not a true contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the primary action front-loaded, followed by the two clarifications that matter. No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter UI tool with annotations covering the safety profile and no output schema, the description covers the meaningful outcomes: draft discarded, file preserved, last-tab edge case. The only missing piece is guidance on sourcing/validating tab_id and any confirmation or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter tab_id has 0% schema description coverage, so the description is the only place semantics could be added. It implicitly indicates that a tab is identified by tab_id but never explains how to obtain one (e.g. from sql_editor_tabs) or what happens with an invalid id, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Close a SQL Editor tab') and immediately scopes what is and isn't affected (draft dropped, open .sql file untouched). This clearly distinguishes it from siblings like sql_editor_tab_new/activate/rename/reorder and from file-deleting tools such as sql_editor_save_file or cleanup tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb-plus-resource ('close a tab'), and the parenthetical about the file being untouched helps an agent judge whether closing is safe with respect to the on-disk file. However, it never says when to prefer this over alternatives (e.g. activate/switch tabs, save_draft before closing) or that unsaved draft content is lost, so no explicit when/when-not routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tab_newA
Open a new, empty SQL Editor tab right after the tab after (else at the end) and make it active.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the safety profile is partially covered. The description usefully adds that the new tab becomes active and where it is positioned, but omits whether the tab is persisted, whether it is empty vs. inheriting context, and any side effects beyond activation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the placement rule front-loaded and activation stated last. No wasted words, every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema, the description covers placement and activation adequately. Minor gaps remain on tab persistence and interaction with draft/file state, but nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning; it does explain the `after` parameter's semantics clearly (insert after that tab, else append at the end, with null default). It could be strengthened by naming the accepted identifier format, but it compensates well for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Open'), resource ('new, empty SQL Editor tab'), and the resulting state ('make it active'). This distinguishes it from siblings like sql_editor_tab_activate and sql_editor_tab_close without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The default placement behavior ('right after the tab `after` (else at the end)') gives implied usage context, but there is no explicit guidance on when to use this versus sql_editor_tab_activate, sql_editor, or sql_editor_open_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tab_renameA
Give a SQL Editor tab its own title; an empty title goes back to the file name or "untitled N".
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| tab_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the agent already knows this is a non-destructive mutation. The description adds the useful reset behavior (empty title → file name or "untitled N"), but says nothing about invalid tab_id handling or other side effects, so it adds some value without fully describing behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the core action front-loaded and the edge case trailing. No wasted words, though a period/semicolon split would read slightly cleaner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with a supporting annotation set and no output schema, the description covers purpose and the key reset edge case. Error/return behavior is omitted but is minor for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does explain the title parameter's empty-value semantics (the most non-obvious part), but tab_id is left entirely to the schema and the default null title behavior is only partially covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Give a SQL Editor tab its own title"), which an agent can map cleanly to the rename action and distinguish from siblings like sql_editor_tab_close or sql_editor_tab_activate. It doesn't explicitly name those siblings, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied from the tool name and purpose; there is no explicit statement of when to rename versus when to use a related tab tool, and no prerequisites. It does clarify one edge case (empty title resets), which lifts it above a bare 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tab_reorderC
Put the SQL Editor tabs in this order (tab ids).
| Name | Required | Description | Default |
|---|---|---|---|
| order | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give only readOnlyHint=false and destructiveHint=false, so the description must supply the rest. It says nothing about what happens to tabs omitted from the list, whether the ordering is atomic, or whether the mutation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence, front-loaded with the verb and resource. Efficient, though its brevity reflects under-specification rather than disciplined economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 and only minimal annotations, the definition is too thin. It omits the behavior for partial/invalid id lists and any confirmation of effect, which an agent needs before invoking a reorder operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'order' parameter has no schema description. The parenthetical '(tab ids)' does clarify that the array holds tab identifiers in the desired sequence, but the key semantic questions (must every open tab be listed? what if an id is unknown?) remain unanswered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reorder) and resource (SQL Editor tabs), clearly distinguishing the action from siblings like sql_editor_tab_close or sql_editor_tab_activate. It does not explicitly name alternatives, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this versus the other tab tools, nor prerequisites (e.g., must the tabs exist first, does it need a saved session). The description only restates the action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_editor_tabsBRead-only
The SQL Editor's tabs in order, each with its open file and unsaved-changes flag, and the active tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. With no output schema, the description does add genuine value by disclosing the shape of the result — ordering, per-tab open file, unsaved-changes flag, and the active tab — which the agent could not otherwise know. It says nothing about edge cases such as an empty tab set, so it is useful but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single declarative sentence with no filler, and the most important information (tabs in order, active tab) is front-loaded. It reads more like a note about the return value than an instruction to the agent, which slightly softens it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and a readOnly annotation, the main remaining burden is describing what comes back — and the description does exactly that, including the unsaved-changes flag that makes the result actionable. Missing only the when-to-use framing that would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema has nothing to document and the baseline of 4 applies. The description correctly implies a parameterless, whole-collection read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the SQL Editor's tabs) and enumerates the payload: tabs in order, each with its open file and unsaved-changes flag, plus the active tab. It is really a return-value statement rather than an action verb, and it draws no boundary against close siblings like sql_editor_state or the sql_editor_tab_* tools, so it stops 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all: no statement of when an agent should call this versus sql_editor_state, sql_editor_files, or the individual tab_* mutators. The only implicit signal is that it reads rather than mutates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_pipelineA
Start a pipeline so it begins (or resumes) loading data.
Args:
pipeline_name: Name of the pipeline to start.
database: Database the pipeline lives in (defaults to the
connection's configured database).
foreground: If true, run synchronously and report rows loaded /
errors in the result instead of returning immediately. Useful
for a one-off load or for testing a pipeline end to end.
limit_batches: Only valid with foreground=True: stop after this many
batches instead of running indefinitely.
if_not_running: Add IF NOT RUNNING so starting an already-running
pipeline is a no-op instead of an error.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| foreground | No | ||
| limit_batches | No | ||
| pipeline_name | Yes | ||
| if_not_running | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explains the synchronous vs. immediate-return distinction, the constraint that limit_batches only works in foreground, and that if_not_running turns a start into a no-op instead of an error. This is strong behavioral disclosure, though it does not cover potential failure modes or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a clear one-sentence purpose followed by a concise parameter list. Every line adds information, and the most important behavior is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the sibling set, the description covers the essential behavior and parameter semantics. It could be slightly more complete by explicitly contrasting with test_pipeline or pipeline_status, but for this tool's complexity it is quite sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It explains all five parameters, including the database default, the meaning of foreground, the conditional validity of limit_batches, and the effect of if_not_running. This goes well beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Start a pipeline so it begins (or resumes) loading data.' This clearly distinguishes start_pipeline from siblings like stop_pipeline, create_pipeline, or pipeline_status, and even adds the nuance that starting can resume an existing pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical usage context, noting that foreground mode is 'Useful for a one-off load or for testing a pipeline end to end.' It does not explicitly name alternatives or say when not to use this tool, so it misses the top tier, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_pipelineA
Stop a running pipeline.
Args:
pipeline_name: Name of the pipeline to stop.
database: Database the pipeline lives in (defaults to the
connection's configured database).
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| pipeline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only repeats the action 'stop a running pipeline' and describes parameters. It does not disclose whether stopping is reversible, whether it interrupts in-flight work, what happens to pipeline state, or whether permission is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely compact, front-loads the core action in the first sentence, and then lists parameters in a structured Args block with no filler or redundant elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with an output schema, the description is close to sufficient, but the lack of behavioral transparency and any guidance about verifying pipeline state creates a gap. An agent could invoke the tool correctly, but it would not know what to expect beyond the fact that the pipeline is stopped.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add meaning for the database parameter by explaining that it 'defaults to the connection's configured database,' which the schema's null default does not convey. The pipeline_name explanation is largely a restatement of the property name, but for two parameters the overall semantics are adequately covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop a running pipeline.' This clearly distinguishes the tool from siblings like create_pipeline, start_pipeline, drop_pipeline, and alter_pipeline, so an agent can identify the correct operation without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'running' implies the tool should be used only on pipelines that are currently active, but the description does not explicitly say when to use this tool versus alternatives. It does not mention checking pipeline_status first, nor does it contrast stopping with dropping or restarting a pipeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_pipelineA
Test an existing pipeline: extract and transform data without loading it into the table.
The pipeline must already exist and must be stopped first (SingleStore
errors if you test a running pipeline) -- call stop_pipeline before this
if needed. Nothing is written to the destination table; this is purely
for validating that the source/format/transform config works.
Args:
pipeline_name: Name of the pipeline to test.
database: Database the pipeline lives in (defaults to the
connection's configured database).
limit: Only pull this many rows/messages instead of testing the
whole batch.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| database | No | ||
| pipeline_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and handles it well. It explicitly discloses that nothing is written to the destination table, that testing a running pipeline causes a SingleStore error, and that the pipeline must already exist and be stopped. These are important behavioral traits beyond what the schema shows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, then prerequisites, then side effects, then parameter details. Every sentence adds value, and the length is appropriate for a tool with nontrivial preconditions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no schema-level parameter descriptions, the description covers all essential context: prerequisites, error condition, side-effect-free behavior, and parameter semantics. The output schema exists to describe return values, so the description does not need to explain them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description documents all three parameters with meaningful semantics: pipeline_name identifies the pipeline, database defaults to the connection's configured database, and limit restricts how many rows/messages are pulled. This fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Test an existing pipeline') plus the key behavioral distinction ('without loading it into the table'), which clearly separates it from start_pipeline, stop_pipeline, and create_pipeline. It also states the validation goal, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit preconditions: the pipeline must already exist and must be stopped first, and it directly tells the agent to call stop_pipeline before this if needed. It also clarifies the tool's use case ('purely for validating source/format/transform config works'), which helps an agent decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_connectionA
Switch the active SingleStore connection; all tools, apps and new notebook kernels then use it.
Args:
name: Name of a saved connection (see list_connections).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is not read-only and not destructive; the description adds the genuinely important behavioral fact that the switch is global and retroactively affects all tools, apps, and new notebook kernels. That is meaningful context beyond the structured fields, though it does not cover persistence across sessions or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence carrying the action and its consequence, plus a minimal Args block. Nothing is wasted and the highest-value information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the annotations cover the safety profile. The global side-effect disclosure fills the main gap, but the tool's relationship to connection_activate (the one ambiguity that could cause a wrong tool choice) is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the burden, and it does partially: it defines 'name' as the name of a saved connection and routes to list_connections for discovery. It does not state the format, case sensitivity, or failure behavior on an unknown name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Switch the active SingleStore connection') and goes further by naming the effect on the environment. It is clear on its own, but it never distinguishes itself from the similarly-named sibling 'connection_activate', which an agent would 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Points the agent to list_connections for valid names, which is useful implied usage, but says nothing about when to prefer this over connection_activate, connection_save, or connection_sso_sign_in, nor any prerequisites for switching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
user_privilegesARead-only
Effective privileges of one SingleStore user with the reason for each (direct, or via role ← group), its groups and roles, resource pool grants, and SHOW GRANTS (password hash hidden). Read-only.
Args:
user: User name.
host: Host part ('%' etc.). Needed only when the name exists for several hosts.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| user | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint=true, so the 'Read-only' line is partly redundant. The description does add one behavioral detail beyond the annotations: the password hash from SHOW GRANTS is hidden. Beyond that it says nothing about permissions required, limits, or error behavior, so it adds only modest value over the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main clause is front-loaded and dense with return content, followed by a compact Args block. Every sentence earns its place, though the trailing 'Read-only' duplicates the annotation and the Args formatting is slightly verbose for two parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe the return, and it does: effective privileges with per-privilege reasons, groups and roles, resource pool grants, and SHOW GRANTS with the hash redacted. It is adequate for a read tool, with only the absence of sibling routing and permission prerequisites as gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameters, and it does both: user ('User name.') and host ('Host part (\'%\' etc.). Needed only when the name exists for several hosts.'). The host explanation adds real semantic meaning (example value and conditional requirement) that the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (effective privileges of one SingleStore user) and enumerates what is returned: reasons per privilege, groups/roles, resource pool grants, and SHOW GRANTS. It is clearly distinguishable from most siblings, though it does not explicitly name the closest alternatives (security_user_detail, who_can_access).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool reads one user's privilege picture, and the host arg notes when it is required ('name exists for several hosts'). There is no explicit when-to-use/when-not or routing against the sibling security_* tools, so an agent must infer when this beats who_can_access or security_user_detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viya_files_browseARead-only
List a folder on SAS Viya for the SQL Editor's Open / Save as: subfolders and .sql / .sas files
(show_all: every file) with size and modified time.
``location``: "content" (SAS Content; starts in My Folder, shortcuts Public and all folders) or "server" (the
SAS Compute server's file system, in the Workspace's SAS session; starts in the first lockdown path, else the
session's home). Each file has ``ref``, the name sql_editor_open_file / _save_file take.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| location | Yes | ||
| show_all | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already covering safety, the description adds real behavioral value: what is returned (subfolders, .sql/.sas files, size and modified time), how show_all widens scope, what location starts in (My Folder / Public; first lockdown path / session home), and the ref field consumers need. It does not cover ordering or error behavior, so not 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then scopes into location and output. The nested parenthetical about content/server defaults is dense and could be flatter, but every sentence carries information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description responsibly conveys the return shape (folders, files, size, modified time, ref). Combined with the location semantics it is nearly complete for a read-only listing tool; the only gap is the path parameter's precise meaning when supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the param burden and mostly does: location's two values are fully explained with their starting points, and show_all is defined as 'every file'. The path parameter is only implied ('List a folder') rather than described, leaving one of three params thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (a folder on SAS Viya), and scopes it to the SQL Editor's Open/Save As flow, distinguishing it from generic filesystem siblings. It also names the downstream tools (sql_editor_open_file / _save_file) whose ref it supplies, so the agent can place it in the workflow 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly frames the context of use ('for the SQL Editor's Open / Save as') and explains the two location modes, which selects the right call. It stops short of explicitly distinguishing from siblings like files_browse or sql_editor_files and offers no when-not guidance, so it is strong context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viya_files_connectionBRead-only
The active SAS Viya connection (files on Viya belong to one), without signing in or starting a session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes a safe read, but the description adds genuinely useful behavioral context: it works without signing in or starting a session, which is a non-obvious side-effect guarantee. It stops short of saying what is returned (connection identity, status, or null when absent), which for a getter is the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no padding; the parenthetical about files belonging to a connection adds context efficiently. It is slightly awkwardly front-loaded (no leading verb), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only getter with no output schema, the description should at minimum state what comes back (the active connection object, its name, or emptiness). That return-value question is left open, though the low complexity keeps the gap modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly signals the no-argument nature through its phrasing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (the active SAS Viya connection) and hints that files on Viya belong to one, but it is a noun phrase with no verb — it never explicitly says whether it retrieves, reports, or verifies the connection. An agent can guess it is a read of current connection state, but it is not stated outright and no sibling is named to distinguish it from sas_viya_state, connections_state, or sas_connections_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no comparison to the many sibling connection/state tools (connections_state, sas_viya_state, sas_connections_state, use_connection). The clause 'without signing in or starting a session' implies a safe context, but the agent must infer when this is preferable to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
viya_files_mkdirC
Create a folder name in parent on SAS Viya ("content" or "server"), for Save as.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| parent | Yes | ||
| location | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say not readOnly and not destructive, which is already weak signal. The description adds no context on permissions required, whether the folder must not already exist, what happens if parent is invalid, or whether the operation is idempotent. For a mutation tool with thin annotations, the description should carry more behavioral burden than it does.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the verb and the essential operands, so it is not bloated. However, the backtick placeholders and parenthetical are awkward for an agent to parse and the sentence tries to pack three concepts without clear separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, no annotations beyond mutation hints, and 0% schema description coverage mean the description must stand alone. It leaves the required location parameter's allowed values ambiguous, gives no return-value or error context, and does not explain the Save as relationship. For a 3-required-parameter mutation tool, this is insufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the schema provides no parameter documentation and the description must compensate. It names three parameters but only loosely: name and parent are shown in backticks without type expectations or format, and location is mentioned only via the parenthetical '("content" or "server")', which does imply an enum without naming it as the location parameter. This is well below what is needed at 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (create) plus resource (folder) with the constraint that it lives on SAS Viya under 'content' or 'server'. The 'for Save as' qualifier narrows intent. It is not tautological, but the cryptic quoting of ``name`` and ``parent`` reads like template syntax rather than plain English.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no stated alternatives, and no indication of prerequisites. Siblings such as viya_files_browse or viya_files_connection are nearby file-system operations, but the description does not distinguish when to mkdir versus browse or save. The 'for Save as' phrase hints at a scenario but is unexplained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
who_can_accessARead-only
Every user who has privileges on a database (or one table in it), and how they got them.
"How" is "direct" (granted to the user), "via role R ← group G" (user -> group -> role), on the database /
table itself or globally on *.*. Administrative global privileges that don't open data (CREATE USER,
PROCESS, ...) and USAGE are left out. Read-only. Opens the Security view on this lookup.
Args:
database: Database name (exact).
table: Optional table in that database.
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| database | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description confirms 'Read-only' and adds substantive behavioral detail beyond that, notably which privileges are deliberately excluded (global admin privileges like CREATE USER/PROCESS and USAGE) and the fact that the lookup navigates to the Security view. That UI side effect is genuinely useful context an agent would not get from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return set, then the 'how' semantics, then the exclusions. The arrow notation ('via role R ← group G') and nested quoting are a little dense, but every sentence carries information and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only two fully documented parameters, the description covers inputs, result content, matching semantics, exclusions, and the read-only/UI behavior. An agent has enough to call it correctly; only the relationship to sibling security tools is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the parameter burden, and it does: database is an exact name match, table is optional and scoped to that database. It adds the 'exact' matching semantics that the schema's bare string type does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: every user with privileges on a database (or one table), plus how they obtained them. An agent can tell this is a privilege-audit lookup rather than a generic query. It never names the closely related siblings (security_who, user_privileges, security_users), so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope definition and the exclusion note, and 'Opens the Security view on this lookup' hints at the workflow it belongs to. However, there is no explicit when-to-use versus security_who or user_privileges, and no stated prerequisites such as requiring a connected session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workloadWorkloadBRead-only
Open the Workload view: define test workloads (SQL statements, each with how often it runs per minute), run them against the cluster with N connections for a set time, watch throughput and latency live, and compare two runs statement by statement (e.g. before and after a new sort key or index).
Args:
name: Workload to select (optional).
The result includes ``browser_url``: post it as a clickable link right under the app.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is already provided, so the safety profile is covered by annotations, and the description does not contradict it (opening a UI view is read-only). It usefully adds that the result carries a browser_url to be rendered as a clickable link, which is real behavioral value beyond the annotations, but it states nothing about session/auth behavior or what the view returns. The phrasing 'run them against the cluster' could be misread as a consuming action, though it describes the view's features rather than this tool's effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is front-loaded in the first two words, which is good, but the body spends several clauses describing the view's feature set and then repeats output-rendering instructions in a second block, padding a one-parameter navigation tool. The Args and browser_url sections each carry some value but the middle sentence does little work for selecting or calling this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately mentions the browser_url return, and readOnlyHint covers safety. However, against a dense sibling set of workload_* tools it fails to establish where this entry point sits relative to workload_run/workload_compare, leaving the main ambiguity an agent would face unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'name' parameter, so the description must carry the meaning. It does document it as 'Workload to select (optional)', clarifying the optionality and purpose, but adds no format, lookup source, or behavior when omitted, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Open the Workload view' is a specific verb+resource, but the rest of the description enumerates capabilities (define statements, run with N connections, compare runs) that are actually performed by the many workload_* siblings, without drawing any line between them. An agent could reasonably conclude this tool itself runs and compares workloads rather than just opening the view, so the purpose is muddied rather than sharpened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a use case ('before and after a new sort key or index'), which gives an agent a rough sense of when the Workload view is relevant. However, it never states when to call this tool versus workload_run, workload_compare, workload_overview, workload_define, or the generic app_page sibling, so the routing guidance is only inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_askBRead-only
Ask the in-app assistant about a workload (it may query the database read-only); the answer arrives in
the chat's inbox (sql_editor_inbox with editor_id = chat_id).
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| chat_id | Yes | ||
| profile | No | ||
| question | Yes | ||
| workload | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds meaningful context beyond that: the assistant 'may query the database read-only' (consistent with the hint) and, more importantly, the answer is delivered asynchronously to the chat inbox via sql_editor_inbox with editor_id = chat_id. That delivery mechanism is behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the action and then the result destination. Efficient with no filler, though the parenthetical is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 where the answer lands (the inbox), which is the key return behavior. However, for a 5-parameter tool with nested objects and zero schema documentation, the parameters and their roles remain unaddressed, leaving an incomplete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 5 parameters (including nested objects 'workload' and 'run'). The description only implicitly ties chat_id to the inbox's editor_id and references 'workload'; question, run, and profile are left entirely undocumented, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Ask the in-app assistant about a workload.' It also names the destination of the result (the chat inbox), which helps an agent understand the interaction model. It stops short of differentiating itself from close siblings like sql_editor_ask, workload_tune, or workload_chat_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (pose a question about a workload, read the answer in the inbox) but there is no explicit when-to-use versus alternatives such as sql_editor_ask or workload_compare. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_assistant_warmARead-only
Start the Workload chat's assistant process ahead of the first question (no model call).
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | ||
| profile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds meaningful behavioral context beyond them: '(no model call)' tells the agent this is a pure warm-up that returns no answer and incurs no model cost. It still doesn't describe the return value or whether repeated calls are idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action front-loaded and the qualifier '(no model call)' appended compactly. Zero wasted words, appropriate for a simple warm-up tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity warm-up tool with no output schema and read-only annotations, the description is mostly sufficient. However, the undocumented 'profile' parameter and the absence of any note on what the call returns (or a status signal) leave a small but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, yet it mentions neither chat_id nor profile. chat_id is self-evident, but the optional 'profile' parameter is left entirely unexplained in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Start the Workload chat's assistant process.' The 'Workload chat' qualifier distinguishes it in scope from the many sibling *_assistant_warm tools (sql_editor, notebook, query_history), though it doesn't name them explicitly. The purpose is unambiguously a pre-warm action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'ahead of the first question' implies when to call it (before the first user question) but never states that workload_ask is the actual answering tool or gives explicit when-not guidance. 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.
workload_chat_contextCRead-only
The context the Workload chat sends with a question (workload, last run, table definitions), as text of at
most limit characters; for asking in the Claude chat instead of the in-app assistant.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| limit | No | ||
| workload | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation covers the safety profile, so that dimension is handled. Beyond it, the description adds only the truncation-to-limit behavior; it does not explain what the workload/run objects must contain, how the context is assembled, or whether the output is mean to be passed to another assistant. For a context-builder tool this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the output and its contents before the usage hint. No wasted words, though the sentence is over-packed and slightly convoluted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 should explain the return shape; it does describe contents and the character cap, which is adequate, but the nested-object parameters and the intended downstream consumer remain unexplained. Borderline minimum viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all three parameters (workload, run, limit) are documented only by bare type titles. The description names the concepts workload, last run, table definitions, which maps loosely, but gives no format, structure, or default semantics for the nested object parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it returns context text sent with a Workload chat question, listing contents (workload, last run, table definitions). But 'workload_chat_context' is ambiguous versus siblings like workload_ask or sql_editor_assistant; it's unclear whether this generates context or retrieves an existing context. The purpose reads as vague rather than a crisp verb+resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trailing phrase 'for asking in the Claude chat instead of the in-app assistant' hints at a use case but gives no explicit when-to-use/when-not guidance or named alternative sibling tool. An agent cannot determine from this when to call workload_chat_context versus workload_ask or sql_editor_ask.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_compareARead-only
Compare two runs of a workload statement by statement: p50 / p95 before and after, change in percent, throughput, errors, and whether the SQL or the row counts changed. Use it to check a tuning change: run a baseline, change the table (sort key, shard key, index ...), run again, compare.
| Name | Required | Description | Default |
|---|---|---|---|
| new_run_id | Yes | ||
| base_run_id | Yes |
TDQS
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 goes beyond that by detailing the comparison output (per-statement percentiles, throughput, errors, schema/row-count deltas) and scope (statement by statement), which meaningfully informs expected behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action followed by a usage scenario. Every clause contributes; there is no filler or repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carries the burden of describing return content by listing the compared metrics. For a simple two-id read-only tool this is close to complete, though it could note prerequisites such as both runs needing to exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the two params (base_run_id, new_run_id) carry only titles. The description implies a baseline-vs-new pairing and before/after semantics, which partially compensates, but it never explicitly maps the identifiers to the base/new roles, leaving a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Compare two runs of a workload statement by statement') and enumerates what the comparison covers (p50/p95 before/after, percent change, throughput, errors, SQL/row-count changes). This clearly separates it from siblings like workload_run, workload_list, or workload_overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage context and workflow: 'Use it to check a tuning change: run a baseline, change the table (sort key, shard key, index ...), run again, compare.' That is a concrete when-to-use, though it names no explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_defineAIdempotent
Create or replace a saved test workload (it can then be run with workload_run, again and again).
Args:
name: Workload name (letters, digits, spaces, . - _).
statements: [{"sql": "...", "per_minute": 30, "name": "Top makes", "database": null, "id": "s1",
"enabled": true}]. per_minute is how often the statement runs (with pacing "max": its relative
weight). SQL may use placeholders filled per execution: {{int:1:1000}}, {{float:0:1}},
{{pick:a|b|c}}, {{date:2024-01-01:2024-12-31}} (quote strings yourself: '{{pick:US|EU}}').
database: Default database for the statements.
pacing: "rate" (each statement per_minute times a minute) or "max" (as fast as the connections can).
concurrency: Connections (parallel workers), 1-64.
duration_s: How long a run lasts, 5 s - 4 h.
timeout_s: Per-statement timeout; the statement is cancelled (KILL QUERY) after it.
arrivals: "even" (fixed spacing) or "random" (Poisson arrivals at the same average rate).
think_ms: Pause between statements per worker (pacing "max").
fetch_rows: Read every result row (off measures just the execute time, not the time to read rows back).
allow_writes: Allow statements other than SELECT / WITH (they run repeatedly: use a test table).
trace_all: Turn on full query tracing on the cluster for the run, so every statement (not just those
over the trace threshold) shows up in Query History afterwards. Affects the whole cluster.
original_name: The workload's current name when renaming it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| pacing | No | rate | |
| arrivals | No | even | |
| database | No | ||
| think_ms | No | ||
| timeout_s | No | ||
| trace_all | No | ||
| duration_s | No | ||
| fetch_rows | No | ||
| statements | Yes | ||
| concurrency | No | ||
| description | No | ||
| allow_writes | No | ||
| original_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Going well beyond the annotations, the description discloses rich runtime behavior: timeout_s triggers a KILL QUERY, allow_writes means statements run repeatedly (warning to use a test table), trace_all affects the whole cluster, fetch_rows toggles whether row read-back time is measured, and arrivals/pacing govern traffic shape. These are exactly the operational consequences an agent needs before calling a test-execution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A one-line purpose is front-loaded, followed by compact per-argument glosses with the most consequential flags (allow_writes, trace_all) carrying explicit caveats. It is dense but every line is justified by a 14-parameter, zero-coverage schema; slight trimming of the placeholder examples could tighten it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, zero-schema-coverage tool with annotations already covering the safety profile and an output schema available, the description supplies the pacing model, limits, side effects, and SQL placeholder dialect an agent needs to call it correctly. Nothing material is missing except the trivial 'description' field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and mostly succeeds: it gives value ranges (concurrency 1-64, duration 5s-4h), pace semantics, placeholder syntax for SQL ({{int:...}}, {{pick:a|b|c}}, quoting strings), statement object shape, and the renaming role of original_name. Only the 'description' parameter is left undocumented, a minor omission against 13 well-specified params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb+resource ('Create or replace a saved test workload') and names the follow-up tool (workload_run). It does not, however, distinguish this from near-siblings like workload_save or workload_from_history, so an agent still has to infer which definition entry point to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the workflow hint that the workload 'can then be run with workload_run, again and again' and via locating tests here ('saved test workload'). There are no explicit when-not conditions or comparisons against workload_save / workload_from_history, which also create or persist workloads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_deleteBDestructive
Delete a saved workload (and optionally its saved runs).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| runs_too | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, so the danger profile is covered. The description adds a real behavioral detail beyond annotations: that saved runs are only deleted optionally, which affects the blast radius of the call. It does not say whether the deletion is irreversible or how a missing name is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero waste, with the primary action front-loaded and the optional side effect trailing in parentheses. Appropriately sized for a two-parameter destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 and undocumented parameters, the description is adequate but thin: it omits irreversibility, permission requirements, and behavior when the workload does not exist. The destructive annotation covers the safety signal, leaving only these gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry parameter meaning. It does convey the semantics of both parameters (name identifies the workload, "optionally its saved runs" maps to runs_too), but it adds no format, matching, or default information beyond that ordinal mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("Delete a saved workload") and clarifies scope with the parenthetical about optionally removing saved runs, which distinguishes it from the sibling workload_delete_run. It is clear, though it does not explicitly name the alternative tools an agent might 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of when the runs_too variant should be preferred. The agent gets a definition but no routing context despite several similar workload tools existing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_delete_runCDestructive
Delete one saved run.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and 'Delete' is consistent with them, so there is no contradiction. But the description adds nothing beyond that: it does not say deletion is permanent, whether the run_id must reference an existing saved run, or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler. It is appropriately sized for a one-parameter tool, though the brevity borders on under-specification rather than genuine economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, one-parameter operation with no output schema and no parameter documentation, the description leaves key questions unanswered: how to obtain run_id, whether the deletion is irreversible, and how it differs from sibling deletion tools. This is thin for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (run_id) with 0% schema description coverage, and the description says nothing about it. It does not explain the expected format or that the ID comes from workload_list, so the agent gets no help locating a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (saved run), and the word 'saved' hints this targets a persisted run rather than an executing one. However, it does not distinguish itself from close siblings such as workload_delete or workload_run, leaving some ambiguity about which deletion surface applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion of alternatives, and no note on irreversibility or prerequisites. An agent must infer from the name alone that this is the right tool versus workload_delete or workload_stop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_from_historyBRead-only
The heaviest read-only queries of the last hours from the query history, as workload statements
(runs per minute = how often they ran). Nothing is saved or run.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| hours | No | ||
| min_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description usefully reinforces this ("read-only", "Nothing is saved or run") while adding output semantics ("runs per minute"). It does not disclose what determines "heaviest", what top/min_ms do, or the shape of the returned workload statements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what is returned, and no filler. The stray backticks around "hours" are a minor formatting blemish but the content is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and three 0%-documented parameters, the description must carry more of the burden. It gestures at the return content (workload statements with runs-per-minute) but leaves top/min_ms and the selection criterion undefined, so an agent cannot fully parameterize the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description only partially compensates: it explains the meaning of "hours" (the lookback window) but never defines "top" (count of queries?) or "min_ms" at all, leaving two of three parameters undocumented in both description and schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: extracts the heaviest read-only queries from the query history and presents them as workload statements. This is more specific than a tautology, but it never names how it differs from nearby siblings like query_history or workload_list, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Nothing is saved or run" implicitly contrasts with workload_save and workload_run, hinting this is inspection-only. However there is no explicit when-to-use condition or named alternative, so the guidance is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_handoff_putCRead-only
Keep statements for a Workload page about to open in the browser (target workload or a new one's name);
returns the id to put in its link as handoff.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | ||
| new_name | No | ||
| workload | No | ||
| statements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, yet the description states it 'Keeps statements' and the name is 'put' – both implying a stateful write to be retrieved later. The description contradicts the read-only annotation instead of clarifying side effects, permissions, or the lifetime/expiry of the stored handoff.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with the action stated first and the return value second; no wasted words. It is compact to the point of being cryptic, but structurally sound.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with 0% schema coverage and no output schema, the description should explain parameter roles and the return contract more fully. It covers the workload/new_name idea and the returned id, but leaves 'database' unexplained and conflicts with annotations, so it is not sufficient to call the tool confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It usefully distinguishes 'target workload or a new one's name', mapping to the workload/new_name pair, and mentions the statements payload. But it omits the 'database' parameter entirely and gives no format or mutual-exclusivity details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description conveys a specific action (keep/store statements) and outcome (returns an id to embed as a 'handoff' link parameter), which is more than a tautology. However, the notion of a 'handoff' is never explained, and the closest sibling (workload_handoff_take) is not referenced, leaving the agent to infer how the pair fits together.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at a context ('Workload page about to open in the browser') but gives no explicit when-to-use rule, no when-not, and no comparison to plausible alternatives like workload_save or workload_define. The agent must guess why it would choose this over saving a workload outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_handoff_takeCRead-only
The statements kept by workload_handoff_put (once: they are then removed).
| Name | Required | Description | Default |
|---|---|---|---|
| handoff_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true, yet the description explicitly states the statements "are then removed" once taken — a state mutation (one-shot consumption of the handoff buffer) that directly contradicts the read-only annotation. An agent relying on readOnlyHint would wrongly assume the operation is idempotent and safe to repeat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short, but brevity here comes at the cost of clarity: the single sentence is a noun fragment whose meaning depends on knowing the sibling tool. It is under-specified rather than efficiently concise, and the key action is not front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param tool with no output schema and a minimal annotation set, the description should explain what is returned (a list of statements?), what the id looks like, and the single-use/error behavior. It omits all of this, leaving an agent unable to call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (handoff_id) with 0% schema description coverage, so the description must carry the semantics. It only hints that the id relates to a handoff created by workload_handoff_put, adding no detail on format, how to obtain it, or what happens if it is invalid or already consumed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description does identify the resource it operates on ("the statements kept by workload_handoff_put") and implicitly names the sibling that creates them, which helps differentiate it from workload_handoff_put. However, it never states the action as a clear verb+resource pair — "take" is only in the tool name — and the fragment phrasing makes the purpose vague to an agent reading the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The reference to workload_handoff_put and the "once: they are then removed" note imply a put-then-take workflow, but there is no explicit when-to-use statement, no prerequisite (e.g., a handoff_id created by put), and no alternative named. Usage must be inferred rather than read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_listARead-only
Saved workloads (with their statements and settings), the run going on now, and recent runs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already covers the safety profile. The description adds only the scope of returned data (saved workloads, current run, recent runs), which is largely covered by the output schema. No auth, rate limit, or pagination behavior is mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence, front-loading the main content with no redundant clauses. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only list tool with an output schema, the description is sufficient to invoke it, though it could do more to help selection among the many workload_* siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters; baseline 4 since the empty schema requires no additional parameter explanation from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific content (saved workloads with statements/settings, current run, recent runs) and implies a list operation from the tool name, but it never uses an explicit verb and does not differentiate from similar siblings like workload_overview or workload_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to use this tool versus alternatives such as workload, workload_run, or workload_overview, nor any prerequisites or exclusion criteria. The description only states what data is returned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_overviewBRead-only
Workloads, recent runs and the running one, for the Workload view.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read. The description adds the scope of data returned (workloads plus recent and currently-running runs), which is modest but real context beyond the annotation; it does not cover pagination, limits, or freshness of the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short clause with no padding, and the core content (workloads, runs, running one) is front-loaded. It is efficient, though the trailing 'Workload view' phrase adds little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema, and a readOnly annotation, the description carries a light burden and mostly meets it by stating the returned content. However, for a tool sitting among many overlapping workload_* siblings, it lacks the routing and scope detail needed to be confidently selected.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies per the scoring rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says what is returned (workloads, recent runs, the running one) but is phrased as a noun fragment rather than a clear verb+resource operation, and it names no sibling to differentiate from workload_list or workload_run in the dense workload_* family. An agent can guess it's an overview/read tool but cannot cleanly tell it apart from its neighbors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is 'for the Workload view', which is an app-surface reference rather than a when-to-use rule. No alternatives, prerequisites, or exclusion conditions are given, so the agent has no guidance on when to pick this over workload_list or workload_run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_parse_statementsCRead-only
Workload statements from SQL texts (the SQL Editor's "→ Workload", the chat's "Add to workload"): leading
-- name: / -- per_minute: hint lines name a statement and set its rate (else per_minute).
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| per_minute | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is covered, and the description does not contradict that. It adds the meaningful behavioral detail that ``-- name:`` / ``-- per_minute:`` hint lines set statement name and rate, which is real parsing behavior beyond the annotations. It stops short of explaining what happens with malformed hints, empty text, or what the parsed output contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is short – essentially one sentence with a parenthetical – so it is concise. However, it is not well front-loaded: the leading content is UI-origin context rather than the tool's contract, and the backtick-heavy syntax makes the single sentence harder to parse than its length warrants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parsing tool with two parameters, one required, 0% schema coverage, and no output schema, the description is thin. It never explains the return value, what the hint-line grammar fully supports, or how the ``per_minute`` parameter interacts with per-statement hints, so an agent cannot confidently call it or interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It explains ``per_minute`` only derivatively, noting that hint lines set the rate "else ``per_minute``", which barely clarifies the parameter's role and default of 60. The required ``sql`` array parameter and its expected format (array of strings, one per statement?) are never described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States it parses workload statements from SQL text, which is a specific verb+resource. But the sentence is grammatically tangled and the purpose is framed largely in terms of UI origins ("the SQL Editor's '→ Workload'", "the chat's 'Add to workload'") rather than a clear contract. It's distinguishable from siblings like workload_run or workload_list, but only loosely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use vs when-not-to-use guidance. The mention of the SQL Editor and chat contexts hints at where the input comes from, but it never says when an agent should call this versus workload_define, workload_run, or workload_from_history. Nothing routes the agent to an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_runA
Start a run of a saved workload (one run at a time). Returns the run id; follow it with workload_status and compare runs with workload_compare. Give runs a label such as "baseline" or "after sort key".
Args:
name: The workload.
label: A short label for this run.
duration_s: Override the workload's duration for this run.
concurrency: Override the number of connections for this run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| label | No | ||
| duration_s | No | ||
| concurrency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only, non-destructive, closed-world mutation. The description adds genuinely useful behavior beyond them: the return value ('Returns the run id'), the single-concurrent-run constraint, and the async-style handoff to workload_status. It does not say whether the call blocks until completion or what happens if a run is already in flight, which would be the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, constraint, and return value in the first two sentences, then the follow-up tools, then the arg list. The args block partly restates schema field names, but each line adds meaning rather than repeating the schema verbatim, so the size is justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no output schema and no annotation detail, the description supplies purpose, return value, concurrency constraint, and downstream workflow. Missing only edge-case behavior (existing run in flight, blocking vs. async completion) and override units.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it does list and gloss all four parameters (name = the workload, label = short run label, duration_s = per-run duration override, concurrency = per-run connection override). It could go further on units/ranges and the fact that duration_s and concurrency are nullable overrides, but the semantics are clearly conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a run of a saved workload') with an explicit scope constraint ('one run at a time'), which cleanly separates it from siblings like workload_status, workload_compare, workload_list, and workload_stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete next-step routing ('follow it with workload_status and compare runs with workload_compare') and a usage pattern for the label ('baseline', 'after sort key'), so an agent knows the intended workflow. It does not name when NOT to use it (e.g., use workload_stop to end a run), so it stops short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_saveCIdempotent
Save a workload from the Workload view (create, replace or rename).
| Name | Required | Description | Default |
|---|---|---|---|
| workload | Yes | ||
| original_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description's '(create, replace or rename)' usefully signals upsert semantics beyond the annotations, but says nothing about permissions, what state a replace overwrites, or side effects on saved runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the verb front-loaded and no filler. The parenthetical is dense but earns its place by enumerating the modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotation-level detail about the opaque nested workload payload, permissions, or failure modes. For a save/upsert tool accepting an unstructured object, the definition leaves an agent under-equipped to construct a valid call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the required 'workload' parameter is a bare object with additionalProperties=true, so its structure is entirely undocumented. The word 'rename' hints that original_name carries the prior name, but that is the only semantic added and the payload shape remains a guess.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb+resource pair ('Save a workload') is unambiguous, and the parenthetical '(create, replace or rename)' names the three modes of operation. This distinguishes it from siblings like workload_delete, workload_list, and workload_run, though it doesn't explicitly contrast with workload_define.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. An agent cannot tell from this description whether to call workload_save, workload_define, workload_update_statement, or workload_from_history for a given intent. The parenthetical lists modes but not selection conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_statusBRead-only
Progress and results of a run (live while it runs): per-statement count, throughput, p50 / p95 / p99 /
max latency, errors and queue wait, plus a per-second timeline from second since.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 valuable context by disclosing the specific metrics returned and the 'live while it runs' behavior. However, it doesn't explain whether results are final after completion or how the per-second timeline behaves, so it adds moderate rather than rich context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It's a single dense sentence that front-loads the core purpose ('Progress and results of a run') and then lists the metrics. No wasted words, though the metric enumeration is packed tightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and readOnlyHint covers safety. The main gap is the near-total lack of parameter documentation (0% schema coverage), with only 'since' partially explained. Adequate but with a clear gap for a required run_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It meaningfully clarifies the 'since' parameter ('a per-second timeline from second since'), adding real semantic value. However, it says nothing about 'run_id' beyond implying the tool operates on a run, leaving that required parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool delivers: progress and results of a run, enumerated with specific metrics (per-statement count, throughput, latency percentiles, errors, queue wait, timeline). It reads as a clear verb+resource concept ('status of a run'), though it does not explicitly name a sibling to differentiate from workload_run or workload_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(live while it runs)' hints at timing but gives no explicit when-to-use guidance. It never states how this differs from workload_run, workload_list, or other run-related siblings, so the agent must infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_stopB
Stop a running workload (the statements running now are cancelled).
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so safety framing is partly covered. The description adds one genuinely useful behavioral fact — in-flight statements are cancelled — but says nothing about whether the stop waits, is idempotent, or what happens if the run already finished.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the core action first and the parenthetical consequence second; nothing is wasted. It is, if anything, thinner than the operation warrants, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. Still missing for a mutation tool: prerequisites/permissions, the resulting state of the run after stopping, and how to identify the correct run_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required run_id parameter, so the schema contributes nothing and the description carries the full burden. It never explains what run_id refers to or where to obtain it (e.g., workload_list / workload_run), leaving the only parameter effectively undescribed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Stop') and resource ('a running workload'), so the agent can immediately tell what the tool does. It does not differentiate from close siblings such as workload_delete_run or stop_pipeline, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no alternative named, despite the presence of related siblings (workload_delete_run, stop_pipeline, workload_status). The only implied usage is 'the workload is running', which the agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_test_statementARead-only
Run one statement once (placeholders filled in) to check it: time, rows or the error. Read-only statements only; others are only checked for placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds real behavioral context: non-read-only statements are not executed, only placeholder-checked, and the result reports time/rows/error. This is useful beyond the annotation, though permissions or rate/side-effect details are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the action and outputs before the read-only constraint. No filler, though the parenthetical '(placeholders filled in)' is slightly cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description does state the return content (time, rows, or error), which is helpful since there is no output schema. But the unexplained 'database' parameter and vagueness on placeholder substitution leave gaps for a 2-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 0%, the description must carry parameter meaning. It hints that the SQL may contain placeholders to be filled in, but never explains the 'database' parameter or the placeholder mechanism, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope: 'Run one statement once' to check it, listing what it yields (time, rows, or the error). This clearly separates it from bulk siblings like workload_run, though it does not name any alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a genuine usage constraint: 'Read-only statements only; others are only checked for placeholders.' This tells the agent when the tool actually executes SQL and when it merely validates it. It stops short of naming a sibling to use instead for full execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_tuneCRead-only
Tuning recommendations for one workload statement (EXPLAIN, table design), as for a query in the history.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| rows | No | ||
| p50_ms | No | ||
| database | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a recommendation-only tool, and the description usefully signals the output kinds (EXPLAIN, table design), so the agent knows nothing is mutated. It still omits whether the statement is executed, what auth or cost is involved, and whether the returned advice is heuristic or executed against the cluster.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding. It is efficient, though the parenthetical and the vague 'as for a query in the history' clause are doing less work than their word count suggests.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema and no parameter documentation anywhere, the description is too thin: it never defines the optional inputs, the expected output shape, or how this differs from the many adjacent tuning and workload tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for four parameters, so the description carries the burden. 'One workload statement' implies the sql parameter, and 'as for a query in the history' loosely gestures at historical metrics like rows and p50_ms, but neither is named and database is entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a deliverable (tuning recommendations) and a scope (one workload statement) with EXPLAIN and table design called out, so the general purpose is discernible. However, the trailing phrase 'as for a query in the history' is ambiguous and it never distinguishes this from near siblings like query_history_tuning, query_advisor_report, or workload_test_statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no routing to alternatives despite a crowded workload_*/query_history_* sibling set. The only hint is the implicit 'one statement' scoping, which the agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workload_update_statementBIdempotent
Write SQL edited in the SQL Editor back into one statement of a saved workload, and save the workload.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| name | Yes | ||
| database | No | ||
| statement_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the write/idempotent profile is covered structurally. The description adds the important behavioral note that it saves the entire workload, not just the one statement, which is genuinely useful context. It does not address permissions, failure behavior, or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence, front-loaded with the core action. There is slight redundancy between 'write ... back' and 'save the workload', but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no output schema and zero parameter documentation, the description covers the primary action and the workload-level side effect but omits the database parameter, error conditions, and any note on which workload state is affected. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for four parameters. It loosely implies sql, name and statement_id, but the optional 'database' parameter is never mentioned and no parameter meaning, format, or default is clarified beyond the schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (write/save), resource (one statement of a saved workload) and the source of the SQL (edited in the SQL Editor). This distinguishes it reasonably from siblings like workload_save or sql_editor_save_draft, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'SQL edited in the SQL Editor', putting it in the post-edit workflow, but there is no explicit when-to-use/when-not or any mention of alternatives like workload_save or workload_define. The agent must infer the context.
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.
40 tool updates
v0.10.1- Changed
app_page2 fields changed- added
Input schema / properties / buildAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Build" +} - added
Input schema / properties / headAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Head" +}
- Added
cas_caslibs - Added
cas_columns - Added
cas_tables - Added
cluster_monitor_backups - Added
cluster_monitor_health - Added
cluster_monitor_history - Added
sas_classify - Added
sas_columns - Added
sas_connection_activate - Added
sas_connection_delete - Added
sas_connection_save - Added
sas_connections_state - Added
sas_execute - Added
sas_history_lookup - Added
sas_libraries - Added
sas_lookup_columns - Added
sas_query - Added
sas_session_reset - Added
sas_sources - Added
sas_tables - Changed
sas_viya_sign_in1 field changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Name" +}
- Changed
sas_viya_sign_out1 field changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Name" +}
- Changed
sas_viya_state1 field changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Name" +}
- Changed
sas_viya_test1 field changed- added
Input schema / properties / nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Name" +}
- Added
schema_explorer_skew - Changed
security1 field changed- changed
Input schema / properties / tab / enumPrevious value: -[ - "users", - "roles", - "pools" -]New value: +[ + "users", + "roles", + "pools", + "audit" +]
- Added
security_admin_capabilities - Added
security_audit - Added
security_change_apply - Added
security_change_plan - Added
security_change_script - Changed
sql_editor_query2 fields changed- added
Input schema / properties / replacesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replaces" +} - added
Input schema / properties / stream_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Stream Id" +}
- Added
sql_editor_rows - Changed
sql_editor_save_draft2 fields changed- added
Input schema / properties / file_versionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "File Version" +} - added
Input schema / properties / sasAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sas" +}
- Changed
sql_editor_save_file2 fields changed- added
Input schema / properties / expected_versionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expected Version" +} - added
Input schema / properties / use_activeAdded value: +{ + "default": false, + "title": "Use Active", + "type": "boolean" +}
- Added
sql_editor_stop - Added
viya_files_browse - Added
viya_files_connection - Added
viya_files_mkdir
58 tool updates
v0.9.0- Added
cluster_config - Added
cluster_monitor_bottomless - Added
cluster_monitor_disk - Added
cluster_monitor_io - Added
cluster_monitor_remote_stats - Added
config_data - Added
query_history_plan_tuning - Added
query_history_profile - Added
query_history_usage - Added
resource_pool_status - Added
schema_explorer_analyze - Added
schema_explorer_analyze_plan - Added
security - Added
security_pools - Added
security_roles - Added
security_tables - Added
security_user_detail - Added
security_users - Added
security_who - Changed
sql_editor1 field changed- added
Input schema / properties / new_tabAdded value: +{ + "default": false, + "title": "New Tab", + "type": "boolean" +}
- Added
sql_editor_classify - Changed
sql_editor_execute3 fields changed- added
Input schema / properties / fileAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "File" +} - added
Input schema / properties / tabAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tab" +} - added
Input schema / properties / tab_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tab Id" +}
- Added
sql_editor_history - Added
sql_editor_history_clear - Added
sql_editor_history_entry - Changed
sql_editor_open_file1 field changed- added
Input schema / properties / rememberAdded value: +{ + "default": true, + "title": "Remember", + "type": "boolean" +}
- Changed
sql_editor_query3 fields changed- added
Input schema / properties / fileAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "File" +} - added
Input schema / properties / tabAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tab" +} - added
Input schema / properties / tab_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tab Id" +}
- Added
sql_editor_save_draft - Added
sql_editor_state - Added
sql_editor_tab_activate - Added
sql_editor_tab_close - Added
sql_editor_tab_new - Added
sql_editor_tab_rename - Added
sql_editor_tab_reorder - Added
sql_editor_tabs - Added
user_privileges - Added
who_can_access - Added
workload - Added
workload_ask - Added
workload_assistant_warm - Added
workload_chat_context - Added
workload_compare - Added
workload_define - Added
workload_delete - Added
workload_delete_run - Added
workload_from_history - Added
workload_handoff_put - Added
workload_handoff_take - Added
workload_list - Added
workload_overview - Added
workload_parse_statements - Added
workload_run - Added
workload_save - Added
workload_status - Added
workload_stop - Added
workload_test_statement - Added
workload_tune - Added
workload_update_statement
76 tool updates
v0.8.1- Added
alerts - Added
alerts_ack - Added
alerts_badge - Added
alerts_check_now - Added
alerts_clear - Added
alerts_data - Added
alerts_update - Added
app_page - Added
cleanup_work_tables - Added
cluster_monitor - Added
cluster_monitor_data - Added
connection_activate - Added
connection_delete - Added
connection_helios_ca - Added
connection_save - Added
connection_sso_sign_in - Added
connection_test - Added
connections_state - Added
connections_window - Added
files_browse - Added
list_connections - Added
notebook - Added
notebook_ask - Added
notebook_assistant_warm - Added
notebook_environment - Added
notebook_environment_install - Added
notebook_files - Added
notebook_kernel_control - Added
notebook_kernel_start - Added
notebook_kernel_state - Added
notebook_open - Added
notebook_packages - Added
notebook_packages_install - Added
notebook_poll - Added
notebook_run - Added
notebook_save - Added
query_advisor_report - Added
query_history - Added
query_history_advisor - Added
query_history_answer - Added
query_history_ask - Added
query_history_ask_cancel - Added
query_history_assistant - Added
query_history_assistant_warm - Added
query_history_compare_cancel - Added
query_history_compare_candidates - Added
query_history_compare_start - Added
query_history_compare_status - Added
query_history_data - Added
query_history_event - Added
query_history_trend_runs - Added
query_history_trends - Added
query_history_tuning - Added
restart_server - Added
sas_viya_save - Added
sas_viya_sign_in - Added
sas_viya_sign_out - Added
sas_viya_state - Added
sas_viya_test - Added
schema_explorer_cleanup_drop - Added
schema_explorer_cleanup_scan - Added
schema_explorer_cleanup_settings - Added
sql_editor - Added
sql_editor_ask - Added
sql_editor_ask_cancel - Added
sql_editor_assistant - Added
sql_editor_assistant_warm - Added
sql_editor_execute - Added
sql_editor_files - Added
sql_editor_inbox - Added
sql_editor_open_file - Added
sql_editor_query - Added
sql_editor_reply - Added
sql_editor_save_file - Added
sql_editor_schema - Added
use_connection
11 tool updates
v0.2.0- Added
browser_link - Added
pipeline_errors - Added
pipeline_monitor - Added
pipeline_monitor_data - Added
query_grid - Added
query_grid_rows - Added
schema_explorer - Added
schema_explorer_databases - Added
schema_explorer_preview - Added
schema_explorer_table - Added
schema_explorer_tables
13 tool updates
v0.1.0- First observed
alter_pipeline - First observed
create_pipeline - First observed
describe_table - First observed
drop_pipeline - First observed
get_pipeline_ddl - First observed
list_databases - First observed
list_pipelines - First observed
list_tables - First observed
pipeline_status - First observed
run_sql - First observed
start_pipeline - First observed
stop_pipeline - First observed
test_pipeline
TDQS
Scored across 185 tools
Many tools overlap within domains (e.g., security vs security_users vs security_user_detail vs user_privileges vs who_can_access/security_who; query_history vs query_history_data; cluster_monitor vs cluster_monitor_data), blurring selection boundaries. While some tools are distinct, the sheer number of app-specific data refreshers and view openers makes it hard for an agent to pick the right one reliably.
All names use snake_case, but the pattern is mixed: some are verb_noun (list_databases, create_pipeline), many are app/view names (security, sql_editor, cluster_monitor), and others are noun phrases (security_change_plan). It's readable but not a predictable verb_noun convention throughout.
185 tools is far beyond any reasonable MCP surface, even for a feature-rich SingleStore server. The extreme count makes discovery and correct selection impractical, matching the 'extreme mismatch' criterion (50+ tools).
The surface is extremely comprehensive, covering SQL execution, schema exploration, pipeline lifecycle, security changes, monitoring, query history/tuning, notebooks, SAS integration, and workload testing. With run_sql providing an arbitrary SQL escape hatch, there are no obvious dead ends for the stated domain.
Maintenance
Related MCP Connectors
Connect to PlanetScale databases, branches, schema, query insights, and execute SQL
Browse, query, and administer your managed WaveHouse + ClickHouse projects (schema, pipes, policy).
Streamkap CLI & MCP server - manage CDC pipelines, sources, destinations, and transforms
Create, manage, and query your Google Cloud SQL resources.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides a lightweight MySQL database interface via stdio, enabling query execution, data manipulation, schema inspection, and connection testing using FastMCP tools.3MIT
- AlicenseCqualityDmaintenanceEnables executing SQL queries, managing databases, and switching between multiple project environments via MCP, without requiring a local MySQL client.14857 npm1MIT
- AlicenseAqualityAmaintenanceEnables Oracle Database schema introspection and SQL execution over stdio, letting MCP hosts list tables, describe columns, and run SQL—read-only by default with opt-in writes.39 npmMIT
- AlicenseAqualityCmaintenanceEnables MCP clients to interact with a 达梦 DM8 database over stdio, providing read-only queries, schema exploration, and optional gated write/DDL operations with strict safety checks.916 npmApache 2.0