Teradata MCP Server
OfficialTeradata MCP Server connects AI agents to Teradata for querying, analysis, admin, and AI pipelines.
Query & Explore: Run SQL (
base_readQuery), preview tables (base_tablePreview), list databases/tables, and get column/DDL details.Data Quality & Stats: Summarize columns, detect missing/negative values, compute distinct categories, mean/stddev, and full univariate stats.
Visualizations: Generate line, pie, polar, and radar charts directly from tables.
Database Admin & Monitoring: Check space usage (system/database/table), SQL history by user/table, session info, resource usage summaries, flow control, feature usage, queue delays, and DB version.
Security & Permissions: List user/role permissions and role assignments.
Lineage & Graph Analysis: Trace dependencies, find root objects, detect cycles, connected components, BFS levels, and composite graph analysis.
SQL Optimization: Cluster and analyze query performance (
sql_*tools) for identifying high-CPU patterns.RAG & Semantic Search: Run complete RAG pipelines (
rag_Execute_Workflow) for context-grounded answers.Extensibility: Save DDL to files, generate edge-contract DDL, and support hooks, semantic layers, and background tasks.
Enables configuration management through environment variables stored in .env files, supporting database connection parameters, LLM credentials, and server settings.
Supports integration with OpenAI models through API key configuration, enabling LLM capabilities within the server environment.
Provides database interaction capabilities with Teradata systems, offering tools for querying, data quality assessment, and database administration tasks such as executing queries, retrieving table structures, analyzing space usage, and performing data quality checks.
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., "@Teradata MCP Servershow me the top 10 customers by total sales this month"
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.

Quick Start (Choose Your Path)
Client | Best For | Setup Time |
Exploratory analysis, platform admin | 5 min | |
Data engineering, agent development | 5 min | |
Testing new LLMs locally | 5 min | |
Build your own client | varies | |
Visual agent builder | 10 min |
Pre-requisites: Teradata database (or free sandbox) + uv
Claude Desktop Setup (No Installation)
Add this to claude_desktop_config.json (Settings > Developer > Edit Config):
{
"mcpServers": {
"teradata": {
"command": "uvx",
"args": ["teradata-mcp-server"],
"env": {
"DATABASE_URI": "teradata://<USERNAME>:<PASSWORD>@<HOST_URL>:1025/<USERNAME>"
}
}
}
}Related MCP server: Teradata Workload Management (WLM) MCP Server
What You Can Do
Use Case | Capabilities | Tools |
Query & Analyze | Explore tables, profile data, explain results, visualize patterns—no SQL needed | |
Semantic Layer | Generate custom semantic layers and tools from YAML or with our Agent Skill | |
AI & RAG Pipelines | Semantic search, retrieval-augmented generation, vector storage | |
Database Admin | Manage security, monitor capacity, automate backups |
What's New (Latest Release)
FastMCP v4 — Sessionless protocol, background tasks for long-running analytics, argument completion
Response Caching — 5-minute TTL signals reduce redundant database queries in multi-turn conversations
Guard Mode — Multi-step confirmation flows for destructive operations (bar_*, sec_*)
Background Tasks —
tdml_*analytic functions return task IDs for polling instead of blockingArgument Completion — Auto-suggest table and column names from schema as users type
Hooks Capability — Intercept tool calls for custom monitoring, audit, or rate-limiting
Row Limit Protection — Configurable caps (
DEFAULT_ROW_LIMIT,MAX_ROW_LIMIT) prevent LLM token overflowEnhanced Security — VX views for fine-grained row-level access control
Extend & Deploy
Add Custom Logic
Use hooks to intercept tool calls for monitoring, audit trails, or validation → Hooks Guide
Define Semantic Layers
Create domain-specific tools, prompts, and cubes in YAML → Customization Guide
Deploy Everywhere
Run as CLI (uv), HTTP server, Docker container, or cloud service → Installation Guide
See It In Action
Voice Agent — Real-time bidirectional audio with Amazon Nova Sonic
Web Agent — Interactive chat UI with Google ADK framework
Flowise Builder — Visual drag-and-drop workflows
Custom Middleware — Performance monitoring patterns
Learn More
Full Documentation — Installation, configuration, architecture, security
Video Tutorials — Step-by-step walkthroughs
Developer Guide — Extend and contribute
Architecture — How components work together
Contributing
We welcome contributions! See our Contributing Guide and Developer Guide to get started.
Available Tools
47 toolsbase_columnDescriptionBase ColumndescriptionARead-onlyIdempotent
List the column names, data types, and basic attributes for a single Teradata table or view. Use for straightforward questions like 'what columns does this table have?' or 'what are the fields and their types?'. For precise Teradata-specific type codes, character sets, decimal precision, index details, or bulk metadata across many objects, use base_columnMetadata instead.
Arguments: database_name - Database name. Defaults to '%' (all databases). table_name - Table or view name. Defaults to '%' (all tables). persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | No | Table or view name. Defaults to '%' (all tables). | % |
| database_name | No | Database name. Defaults to '%' (all databases). | % |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, covering safety. The description adds context about 'basic attributes' vs 'precise Teradata-specific type codes', which is useful. However, it claims this is 'for a single Teradata table or view' while the parameters default to '%' (all databases/tables), creating an inconsistency about actual scope behavior that is not fully 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 well-structured: purpose, usage examples, alternative tool, then parameter list. It is mostly concise, though the argument list duplicates schema-provided information. Still, it front-loads the core verb and resource, and every sentence serves a clear role.
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 listing tool with no output schema, the description covers functionality, examples, and alternative routing. However, it does not clarify the single-table promise against the wildcard defaults, nor describe the exact return format beyond 'column names, data types, and basic attributes'. Given the lack of an output schema, a bit more detail would make 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?
Schema description coverage is 100%, so the baseline is 3. The description repeats the parameter descriptions already present in the schema but adds no new semantic meaning beyond what the schema provides. The wildcard defaults are documented in the schema, so no compensation 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 a specific verb ('List'), resource ('column names, data types, and basic attributes for a single Teradata table or view'), and explicitly differentiates from sibling base_columnMetadata. An agent can distinguish this tool immediately, even before looking at 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?
The description explicitly tells when to use this tool ('Use for straightforward questions like...') and when to use the alternative ('For precise Teradata-specific type codes... use base_columnMetadata instead'). Both conditions and the sibling name are given, leaving no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_columnMetadataBase ColumnmetadataARead-onlyIdempotent
Retrieve detailed technical column metadata for Teradata tables and views, including exact Teradata type codes, character sets (LATIN/UNICODE), decimal precision, scale, nullability, and index classification. Use when the user needs precise Teradata-specific column information, not just basic column names and types. For a simple list of columns and types for a single object, use base_columnDescription instead. Supports bulk retrieval across many objects with payload and time budgets.
Resolution paths: Tables (T, O, Q) — DBC.ColumnsVX + DBC.IndicesVX. No HELP COLUMN. Views (V) — HELP COLUMN with derived-table wrapper, the only reliable mechanism for resolving view column types.
Uses the native TeradataConnection cursor pattern, consistent with all other tools in this module.
Technical capabilities:
Exact Teradata type codes and their SQL type string equivalents
Character set information (LATIN, UNICODE, etc.)
Decimal precision and scale
Detection of broken/invalid views
Column-level metadata for all objects in a database at once
LARGE-SCALE USAGE GUIDANCE:
When retrieving metadata for many objects (e.g. all views in DBC), both the response payload and the execution time can exceed limits. Use these strategies to control both:
FILTER FIELDS: Pass only the columns you need via the
fieldsparameter. View rows via HELP COLUMN return ~49 fields by default; table rows via DBC.ColumnsVX return fewer. Trimming to 6-8 fields can reduce payload by 80%+. Three computed fields (ColumnTypeString, IndexTypeString, CharSetString) are always included automatically. Example: fields='ColumnName,ColumnType,ColumnLength,CharType, UpperCase,Nullable,Indexed?,Primary?,Unique?'EXCLUDE OBJECTS: Use
exclude_objectsto skip objects you do not need. Accepts SQL LIKE patterns (% wildcard) as a CSV. Applied before any metadata queries, so excluded objects consume zero time and zero payload. Example: exclude_objects='ResUsage%,%ResUsage%,Res%View'INCREASE PARALLELISM: Set
max_workersto 12-16 for large databases. Each worker gets its own Teradata session via conn.cursor(). Default is 8.FILTER BY KIND: Use
table_kindto limit to just the object types you need (e.g. 'V' for views only, 'T' for tables only).PAYLOAD BUDGET: Use
max_payload_kb(default 900) to set the maximum response payload size in kilobytes. When the accumulated result data approaches this limit, the tool stops collecting and returns what it has, plus aremaining_objectsCSV in metadata listing the unprocessed objects. Pass that CSV straight intoobject_nameon the next call for automatic continuation. This self-adapts to object sizes: small-column views fit more per call, large-column views page earlier.TIME BUDGET: Use
max_execution_seconds(default 180) to set the maximum wall-clock execution time. The tool monitors elapsed time as each object completes, and self-interrupts BEFORE the MCP transport timeout (typically 240s) kills the session without returning any data. When the time budget is reached, the tool returns all data collected so far plusremaining_objectsfor continuation — exactly the same pattern as payload budget. This is the key difference from an MCP timeout: a timeout returns NOTHING; a time budget returns EVERYTHING collected so far, plus a continuation token.
CONTINUATION PATTERN (automatic pagination): # Call 1 — starts processing, time or payload budget fills up result1 = base_columnMetadata(database_name='DBC', table_kind='V', ...) # metadata contains: remaining_objects='ViewX,ViewY,...'
# Call 2 — pass remaining_objects as object_name
result2 = base_columnMetadata(
database_name='DBC',
object_name='ViewX,ViewY,...', # from result1 metadata
...
)
# Repeat until metadata has no remaining_objects key.Typical call for a large database: base_columnMetadata( database_name='DBC', table_kind='V', exclude_objects='ResUsage%,%ResUsage%', fields='ColumnName,ColumnType,ColumnLength,CharType, UpperCase,Nullable,Indexed?,Primary?,Unique?', max_workers=16, max_payload_kb=900, max_execution_seconds=180 )
Arguments:
conn - TeradataConnection (injected by MCP server)
database_name - Name of the Teradata database to inspect
object_name - Optional: specific object name, or a CSV of
names. Also used for continuation: pass the
remaining_objects value from a previous
truncated call to resume.
If omitted, all objects matching table_kind
are processed.
table_kind - Optional: CSV of TableKind codes to filter by.
Examples: 'V' (views only), 'T,O' (tables +
NoPI), 'T,V' (tables and views). Defaults to
all qualifying object types (T, O, V, Q).
Tables (T, O, Q) use DBC.ColumnsVX +
DBC.IndicesVX. Views (V) use HELP COLUMN with
a derived-table wrapper to force type
resolution — this is the only reliable
mechanism for view column types.
Stored procedures (P, E), functions
(A, F, R, B, S), and macros (M) are not
supported. DBC.ColumnsVX does return parameter
rows for these object types, but their
parameter semantics (IN/OUT/INOUT,
SPParameterType) are incompatible with the
column metadata model this tool produces.
Support is a planned future enhancement.
max_workers - Optional: number of parallel threads for view
resolution via HELP COLUMN. Default: 8.
Table metadata is retrieved via DBC.ColumnsVX
and DBC.IndicesVX within the same worker pool.
fields - Optional: CSV of field names to include in the
response. Reduces payload size significantly.
Computed fields (ObjectName, ColumnTypeString,
IndexTypeString, CharSetString) always included.
exclude_objects - Optional: CSV of object name patterns to
exclude. Uses SQL LIKE-style % wildcards.
Applied before any database calls — excluded
objects incur zero query cost.
max_payload_kb - Optional: maximum response payload budget in KB.
Default: 900. Set to 0 to disable.
max_execution_seconds - Optional: maximum wall-clock execution time in
seconds. Default: 180. Set to 0 to disable.
*args - Positional bind parameters (reserved)
**kwargs - Named bind parameters (reserved)
Returns: MCP-compliant response via create_response() containing a list of column metadata records with normalised keys and four computed string fields per column:
ColumnTypeString - Human-readable SQL type (e.g. "VARCHAR(200)
UNICODE", "DECIMAL(18,2)", "INTEGER")
IndexTypeString - Index classification: 'UPI', 'NUPI', 'USI',
'NUSI', or None if not indexed.
For tables (T, O, Q): sourced from
DBC.IndicesVX — composite index grouping
(IndexNumber + ColumnPosition) is fully
preserved.
For views (V): sourced from HELP COLUMN
flags — reports column participation only,
not composite index grouping. Query
DBC.IndicesVX against the base table for
full composite index detail.
CharSetString - Character set name: 'LATIN', 'UNICODE',
'KANJI1', 'GRAPHIC', 'KANJISJIS', or None.
CaseSpecificityString - Case attribute: 'UPPERCASE', 'CASESPECIFIC',
'NOT CASESPECIFIC', or None if no explicit
case attribute is defined on the column.
When truncated, metadata will include:
remaining_objects - CSV of unprocessed object names
truncated - True
truncation_reason - 'time_budget_exceeded' or
'payload_budget_exceeded'
elapsed_seconds - Wall-clock time consumed (always present)
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| table_kind | No | ||
| max_workers | No | ||
| object_name | No | ||
| database_name | Yes | ||
| max_payload_kb | No | ||
| exclude_objects | No | ||
| max_execution_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds substantial behavioral context beyond those hints: it explains that the tool self-interrupts before MCP transport timeouts, returns partial data plus a `remaining_objects` continuation token, always includes three computed fields, uses HELP COLUMN for views with derived-table wrapper, and excludes stored procedures/functions/macros. There is no contradiction between description and 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?
Though long, the description earns its length for a complex tool with 8 parameters across 0% schema coverage and no output schema. It is well structured with clear headers (Technical capabilities, LARGE-SCALE USAGE GUIDANCE, CONTINUATION PATTERN, Arguments, Returns), numbered strategies, and code examples. The purpose and sibling distinction are front-loaded, followed by actionable operational details. No filler or repetition is present.
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 fully documents return values: computed fields (ColumnTypeString, IndexTypeString, CharSetString, CaseSpecificityString), truncation metadata (remaining_objects, truncated, truncation_reason, elapsed_seconds), and the continuation pattern. It also covers edge cases like unsupported object types and view vs. table resolution paths, making it complete for an agent to invoke correctly without external knowledge.
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 does: each of the 8 parameters (database_name, object_name, table_kind, max_workers, fields, exclude_objects, max_payload_kb, max_execution_seconds) is explained with purpose, defaults, and often examples. The object_name parameter's dual role as both target and continuation token is explicitly described, and the table_kind parameter includes unsupported object-type rationale.
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: 'Retrieve detailed technical column metadata for Teradata tables and views'. It names exact capabilities (type codes, character sets, decimal precision, nullability, index classification) and explicitly distinguishes itself from the sibling tool base_columnDescription by stating 'For a simple list of columns and types for a single object, use base_columnDescription instead.' An agent can immediately tell when to select this 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 provides explicit usage direction: 'Use when the user needs precise Teradata-specific column information, not just basic column names and types' and names the alternative. It goes far beyond basic with a dedicated LARGE-SCALE USAGE GUIDANCE section featuring five numbered strategies (fields filtering, exclude_objects, parallelism, table_kind filtering, payload/time budgets), a continuation pattern with code examples, and a typical large-database call. It even clarifies when not to use it (simple lists) and names unsupported object types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_databaseListBase DatabaselistARead-onlyIdempotent
List all databases or schemas available in the Teradata system. ONLY call when the user explicitly asks which databases or schemas exist on the system. Do NOT call this tool as a preliminary step toward listing tables — if the user asks about tables without naming a database, ask them which database they mean rather than discovering databases first.
Arguments: scope - Filter scope: 'user' returns only user-created databases (excludes system databases), 'all' returns every database. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Filter scope: 'user' returns only user-created databases (excludes system databases), 'all' returns every database. | user |
| persist | No | If True, materializes result as a volatile table and returns table name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the read-only safety profile is covered. The description aligns with this ('List') and adds the persist behavior (materializing as a volatile table), which is useful context beyond the annotations. However, it doesn't disclose return format or ordering, and the persist detail is already present in the schema, so the added value is moderate.
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 purpose and usage guidance, and the parameter documentation is cleanly separated. It's slightly longer than strictly necessary because the params duplicate the schema, but every sentence earns its place — especially the high-value exclusion guidance.
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?
Complete for a simple, two-parameter tool with no output schema and both params optional. It covers purpose, scope semantics, persist behavior, and precise usage boundaries. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both scope and persist fully documented in the input schema. The description's Arguments section largely restates what the schema already provides, adding minimal new meaning. Baseline 3 is appropriate when the schema carries the documentation burden.
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 ('List all databases or schemas available in the Teradata system') that clearly distinguishes it from siblings like base_tableList. The explicit instruction not to use it for table-listing tasks further cements its unique role.
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 exemplary when-to-use guidance: 'ONLY call when the user explicitly asks which databases or schemas exist.' It also gives an explicit when-not-to-use rule and instructs the agent to ask the user which database they mean instead of discovering databases first — precise routing with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_readQueryBase ReadqueryARead-onlyIdempotent
Execute a user-provided SQL query against Teradata and return the results. Use this tool ONLY when the user supplies an explicit SQL statement or a request that includes filter conditions (WHERE clause, aggregations, JOINs, etc.). Do NOT use for simply browsing or sampling rows from a table — use base_tablePreview for that. The sql parameter is required and must contain the full SQL text.
Arguments: sql - SQL text, with optional bind-parameter placeholders persist - Set to True to persist the results as a table and reuse it later. Recommended for large result sets. row_limit - Maximum rows to return (default 1000, ceiling 50000). Pass a higher value when you need more rows.
When the response metadata contains 'truncated: true', more rows exist beyond the limit. To get more data:
Pass a higher row_limit (up to 50000) to retrieve more rows in the response.
Use persist=true to write all rows to a volatile table and query it directly — this bypasses the row limit entirely and is the recommended approach for large result sets.
Returns: ResponseType: formatted response with query results + metadata (includes 'volatile_table' field in metadata if persist=True) (includes 'truncated' and 'row_limit' in metadata when results are capped)
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | ||
| persist | No | ||
| row_limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the row_limit default (1000) and ceiling (50000), the 'truncated' metadata flag, and the persist option writing to a volatile table. It also tells the agent how to obtain more rows, including a path that bypasses the row limit.
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 content is well front-loaded and organized into arguments, truncation handling, and returns. It is slightly redundant — persist is 'recommended for large result sets' twice — but every major operational point 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 three-parameter tool with no output schema, the description supplies the missing return contract: formatted query results plus metadata, with 'volatile_table', 'truncated', and 'row_limit' fields. It also covers practical large-result behavior, so an agent can call and interpret 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?
With 0% schema coverage, the description fully explains sql, persist, and row_limit, including defaults and bound-parameter placeholders. One point is deducted because the description calls sql 'required' while the input schema marks it optional (default null), an inconsistency an agent may stumble on.
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 action: 'Execute a user-provided SQL query against Teradata and return the results.' It also distinguishes this tool from row-browsing by saying it is for explicit SQL with filters, aggregations, or JOINs, unlike base_tablePreview.
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 go condition ('ONLY when the user supplies an explicit SQL statement...'), an explicit don't-use condition ('Do NOT use for simply browsing or sampling rows'), and names the alternative (base_tablePreview). An agent can select this tool without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_saveDDLBase SaveddlARead-onlyIdempotent
Extract the DDL for a Teradata table, view, or stored procedure and SAVE it as a .sql file on disk. Use this tool ONLY when the user explicitly wants to export, write, download, or persist DDL to a file. Do NOT use simply to display or view DDL in the conversation — use base_tableDDL to display DDL without saving.
Arguments: database_name - Database name (e.g., 'MKTG_USR') table_name - Object name (e.g., 'SP_LOAD_VARIABLES_ARGUMENTARIO_IAG_FICHA_CLIENTE'). Accepts comma-separated values for bulk retrieval. object_type - Type of object: 'PROCEDURE', 'TABLE', 'VIEW' (default: 'PROCEDURE') output_dir - Directory where to save the DDL file (default: './ddls_extracted')
Returns: ResponseType: formatted response with file path, size, and metadata
| Name | Required | Description | Default |
|---|---|---|---|
| output_dir | No | ./ddls_extracted | |
| table_name | Yes | ||
| object_type | No | PROCEDURE | |
| database_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, so the safety profile is already covered. The description adds useful behavioral context: it writes a file to disk, accepts comma-separated values for bulk retrieval, and returns file path/size/metadata. However, it doesn't disclose details like whether existing files are overwritten, whether the output directory is created automatically, or any permission requirements. With annotations covering the read-only/idempotent nature, 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?
The description is well-structured: a clear first sentence, explicit usage routing, a compact argument list, and a returns note. It is slightly longer than strictly necessary because it repeats argument details that could live in the schema, but every sentence earns its place and the key scoping constraint 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?
For a 4-parameter tool with no output schema, the description covers the essential call contract: what it does, when to use it, all parameters with defaults, and the response type. Minor gaps remain (file overwrite behavior, directory creation, error handling for invalid object types), but the description is complete enough for an agent to select and invoke the tool correctly in most 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?
Schema description coverage is 0%, so the description must compensate. It does: it explains database_name with an example, table_name with an example and the comma-separated bulk behavior, object_type with the allowed values and default, and output_dir with its default. This adds meaning well beyond the bare schema, though it doesn't specify exact file naming or path validation 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 verb ('Extract... and SAVE'), a clear resource (Teradata table, view, or stored procedure), and the output artifact (.sql file on disk). It also explicitly distinguishes itself from base_tableDDL, which displays DDL without saving, so an agent can tell them apart 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?
The description gives explicit when-to-use guidance: 'Use this tool ONLY when the user explicitly wants to export, write, download, or persist DDL to a file.' It also names the alternative (base_tableDDL) and the condition that selects it ('Do NOT use simply to display or view DDL in the conversation'). This is clear routing with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_tableAffinityBase TableaffinityARead-onlyIdempotent
Identify which tables in a database tend to co-occur together in the same SQL queries, revealing natural JOIN relationships and data affinity patterns. Use when the user asks which tables are queried together, what tables are related to a specific table, or what tables are commonly used in the same workflows. For access frequency, query counts, or per-user access statistics, use base_tableUsage instead.
Arguments: database_name - Database name table_name - Table or view name persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table or view name | |
| database_name | Yes | Database name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and idempotent behavior. The description adds useful context beyond that by explaining the persist option materializes a volatile table and returns its name. It does not contradict the annotations, since a volatile table is transient and does not imply a persistent mutation.
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, usage guidance, and sibling differentiation are all front-loaded and economically worded. The repeated argument list adds some redundancy with the schema but does not make the description bloated or hard 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 tool with three parameters, no output schema, and a clear sibling distinction, the description covers what the tool does, when to use it, when not to use it, and the effect of the persist flag. Nothing needed for correct invocation or selection 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 100%, so the input schema already fully documents all three parameters. The description's argument list essentially repeats the schema text ('Database name', 'Table or view name', 'If True, materializes result...') without adding new semantic detail, meeting but not exceeding the baseline.
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 ('Identify') and a precise resource ('tables that co-occur together in SQL queries'), making the tool's purpose immediately clear. It also distinguishes itself from sibling analysis tools by focusing on affinity/JOIN relationships rather than usage frequency.
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 explicitly states when to use this tool ('when the user asks which tables are queried together, what tables are related...') and names the exact alternative for different needs ('use base_tableUsage instead'). This gives an agent clear routing criteria without requiring schema inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_tableDDLBase TableddlARead-onlyIdempotent
Return the CREATE TABLE DDL statement for a Teradata table, showing its full schema definition including column types, constraints, primary indexes, and keys. Use when the user wants the CREATE statement, the table definition, or needs to see how the table was built. If the user has not specified both a table name AND a database name, ask for clarification before calling — do not guess or use an empty database name. To save DDL to a file on disk, use base_saveDDL instead. For just column names and types, use base_columnDescription instead.
Arguments: table_name - Table name database_name - Database name persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name | |
| database_name | Yes | Database name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds useful behavior beyond that: the optional persist flag materializes the result as a volatile table and returns the table name, and it clarifies the required input combination. It does not detail missing-table or permission errors, but with annotations in place this is adequate and does not contradict them.
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 usage guidance are front-loaded, and the displacement to siblings is compressed into short, direct sentences. The argument list duplicates the input schema, which costs a point, but the overall structure is scannable and free of 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?
Even without an output schema, the description explains what is returned (the DDL text with column types, constraints, primary indexes, and keys) and what persist does. It also covers the required input combination and routes alternative needs to the correct sibling tools. No critical information needed to select and call the tool 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 100%, so the baseline is 3. The description's argument list repeats the same one-line meanings already in the schema and adds little semantic detail. The most valuable parameter-related guidance, 'ask for clarification rather than guess or use empty database name', appears in the prose rather than as deeper parameter 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?
States a direct action ('Return') and a specific artifact ('CREATE TABLE DDL statement for a Teradata table'), and enumerates what the DDL includes. It also distinguishes itself from siblings by naming base_saveDDL and base_columnDescription, so an agent knows exactly what this tool does and does not do.
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 provides the trigger condition ('Use when the user wants the CREATE statement...'), a mandatory precondition (ask if both table and database names are not specified rather than guessing), and named alternatives with their conditions ('To save DDL to a file... base_saveDDL', 'For just column names and types... base_columnDescription'). This is excellent routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_tableListBase TablelistARead-onlyIdempotent
List all tables and views within a specific Teradata database or schema. Pass a specific database name to list tables in that database only. Omit or leave empty to list tables from all databases. If the user does not name a database and you want to list tables from a single database, ask a clarifying question instead of returning results from all databases.
Arguments: database_name - Database name. Leave empty to list tables from all databases. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| database_name | No | Database name. Leave empty to list tables from all databases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context: the tool returns results from all databases when database_name is empty, and the persist parameter materializes results as a volatile table and returns the table name. This goes beyond the annotations and helps the agent understand side effects (volatile table creation) despite the read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by parameter details and usage guidance. The clarifying-question sentence is slightly verbose but earns its place by preventing a common misuse. 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 two optional parameters and no output schema, the description covers the main decision points: what it lists, how to scope it, and what persist does. It doesn't describe the return format, but the annotations and simplicity of the tool make that a minor gap. The clarifying-question guidance adds completeness for real-world agent use.
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 100%, so the schema already documents both parameters fully. The description repeats the parameter meanings but adds a usage nuance: the clarifying-question guidance for database_name. This is useful but not a major addition beyond the schema, so a baseline 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?
The description states a specific verb ('List') and resource ('all tables and views within a specific Teradata database or schema'), and clearly distinguishes the tool's scope from siblings like base_databaseList and base_tableDDL. It also explains the optional database_name behavior, 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 explicitly tells the agent when to use the tool (list tables in a specific database) and when not to (if the user doesn't name a database, ask a clarifying question instead of returning all databases). It also provides clear guidance on the persist parameter's effect, which helps the agent decide whether to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_tablePreviewBase TablepreviewARead-onlyIdempotent
Return a quick sample of the first few rows from a Teradata table or view so the user can see what data looks like, with no SQL required. Use this tool when the user wants to explore or peek at a table's contents without specifying conditions or writing a query. Do NOT use when the user provides a WHERE clause, filter, or explicit SQL statement — use base_readQuery for that.
Arguments: table_name - Table or view name database_name - Database name persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table or view name | |
| database_name | No | Database name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's main pulse for behavior is safe. The description goes further by explaining the persist option materializes a volatile table and returns the table name, as well as clarifying that no SQL is required. It doesn't disclose the exact row limit or response format, but the core behavior is well 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?
The description leads with the purpose, then gives usage guidance, and then lists arguments. It is well-organized but the 'Arguments' section duplicates the input schema with no added detail. Still, it is a compact length and front-loaded with the most actionable 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 simple preview tool, the description covers what it does, when to use it, and the significant persist side effect. Though no output schema exists, the description hints it returns rows and possibly a table name. It doesn't explicitly mention the number of rows or response format, which is a minor gap but overall adequate for an agent to safely invoke 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 100%, so the schema already documents all parameters. The description reproduces the parameter names and short descriptions but adds no new semantics beyond the schema (e.g., it doesn't explain row limit, table naming rules, or edge cases). Baseline 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?
The description states a specific action ('Return a quick sample of the first few rows') on a specific resource (Teradata table or view), and explicitly distinguishes it from base_readQuery by noting the lack of SQL/filter usage. This clearly sets it apart from siblings like base_readQuery and base_tableList.
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 provides explicit 'when to use' ('explore or peek at a table's contents without specifying conditions') and 'when not to use' (the user provides WHERE clause, filter, or explicit SQL) conditions, naming the alternative tool (base_readQuery).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
base_tableUsageBase TableusageARead-onlyIdempotent
Report access frequency and per-user query patterns for tables and views in a Teradata database, showing which objects are most actively queried and by whom. Use when the user asks how often tables are accessed, which tables are most popular, or which users are running queries against a database. For discovering which tables appear together in the same queries, use base_tableAffinity instead.
Arguments: database_name - Database name. Leave empty for all databases. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| database_name | No | Database name. Leave empty for all databases. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds the persistence behavior (materializing as a volatile table when persist=True), but this is also present in the input schema, so it adds only modest value beyond structured fields. There is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose, usage triggers, and alternative are stated in the first two sentences. The Arguments block is redundant with the schema but not bloated, and the overall length is appropriate for a 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 read-only reporting tool with two optional parameters and no output schema, the description adequately conveys what is reported (access frequency, per-user patterns, popular objects) and how optional parameters behave. It could describe output shape more concretely, but the coverage is sufficient 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 100%, and the input schema already documents both database_name and persist with the same wording. The description repeats those explanations rather than adding new semantic detail, so it meets the baseline but does not elevate 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 opens with a specific verb and resource: 'Report access frequency and per-user query patterns for tables and views in a Teradata database.' It also explicitly differentiates itself from the sibling tool base_tableAffinity by noting that co-occurrence analysis belongs to that tool, so an agent can select correctly.
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 trigger conditions: 'Use when the user asks how often tables are accessed, which tables are most popular, or which users are running queries against a database.' It also provides a when-not and alternative: 'For discovering which tables appear together in the same queries, use base_tableAffinity instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_databaseSpaceDba DatabasespaceARead-onlyIdempotent
Show disk space allocation for a specific named Teradata database. Use when the user asks how much space a particular database is using or how much has been allocated to it. If no database name is provided, ask for clarification — do not call with an empty database name. For table-level breakdowns within a database, use dba_tableSpace. For system-wide totals across all databases, use dba_systemSpace.
Arguments: database_name - Database name. Required — do not pass empty string. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| database_name | Yes | Database name. Required — do not pass empty string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent. The description adds useful behavioral context beyond annotations by requiring clarification for missing database names and explaining that persist materializes a volatile table and returns its name. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the main purpose, followed by usage guidance and parameter notes. It is slightly redundant with the schema's parameter descriptions, but 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 two-parameter read-only tool with full schema coverage and no output schema, the description is nearly complete. It covers scope, sibling alternatives, required argument behavior, and the persist side effect; only the exact return format is left 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?
Schema description coverage is 100%, so the schema already documents both parameters. The description repeats the parameter details rather than adding meaning beyond the schema, which meets the baseline but does not exceed 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 a specific verb and resource: 'Show disk space allocation for a specific named Teradata database.' It also explicitly differentiates itself from sibling tools dba_tableSpace and dba_systemSpace, so an agent can distinguish it immediately.
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 ('when the user asks how much space a particular database is using'), a clear guardrail ('If no database name is provided, ask for clarification — do not call with an empty database name'), and names alternative tools for different scopes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_databaseVersionDba DatabaseversionARead-onlyIdempotent
Return the Teradata database software version and release information. Use when the user asks what version of Teradata is running on the system.
Arguments: persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds meaningful behavioral context by disclosing that setting persist to True materializes results as a volatile table and returns the table name, which is not implied by 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 description is short, front-loaded with the purpose, and includes a clear usage trigger. The argument explanation slightly duplicates the schema, but this is minor and does not bloat the description.
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 one optional parameter and strong annotations, the description covers the core behavior and usage context. It does not detail the exact return format beyond 'version and release information', but this is a minor gap given the simplicity of the 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 description coverage is 100% for the single persist parameter, so the baseline is 3. The description repeats the same parameter text as the schema without adding new meaning or clarifications, so it neither improves nor harms parameter understanding.
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 action ('Return the Teradata database software version and release information') tied to a concrete resource, which clearly differentiates it from the many sibling dba_* tools. It also names the exact user intent that triggers it, leaving no ambiguity about what the 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?
The description explicitly states when to use it: when the user asks what version of Teradata is running. It doesn't mention alternatives or when not to use it, but among the sibling list there are no other version-focused tools, so the guidance is clear and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_featureUsageDba FeatureusageARead-onlyIdempotent
Report which Teradata product features were used during a specified date range. Use when the user asks about feature adoption, which Teradata capabilities are being used, or how feature utilization has changed over a period.
Arguments: start_date - The start date for the query range in YYYY-MM-DD format. end_date - The end date for the query range in YYYY-MM-DD format. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| end_date | Yes | The end date for the query range in YYYY-MM-DD format. | |
| start_date | Yes | The start date for the query range in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is known. The description adds valuable behavioral detail about the persist parameter (materializing as a volatile table and returning the table name), which goes beyond the annotations. It does not contradict the annotations. No further side effects are disclosed, but given the read-only nature, this is sufficient.
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: a clear purpose sentence, a usage guideline, and an Arguments section. It is front-loaded with the purpose and usage. The Arguments section is slightly redundant given the schema, but it is concise and not verbose. It earns a 4 rather than 5 due to minor 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?
For a reporting tool with no output schema, the description does not fully specify the return format. It only mentions that when persist is true, a table name is returned; otherwise the result shape is left implicit. Given the complexity and sibling tools that likely return tabular data, more detail on output would improve completeness. It is adequate but not 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 100%, so all parameters are documented in the schema. The description repeats the parameter explanations in the Arguments section without adding any new semantics. Per the rubric, when schema coverage is high, baseline is 3, and the description does not elevate 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 a specific action ('Report') on a clear resource ('Teradata product features') with a date-range scope. It distinguishes itself from sibling tools like dba_tableUsage and dba_resusageSummary by focusing on feature adoption rather than table or resource usage. The purpose is unambiguous and not a tautology.
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 'Use when' conditions are provided, covering feature adoption, capability usage, and utilization changes. However, it does not mention alternatives or explicitly state when not to use this tool, which is the only gap from a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_flowControlDba FlowcontrolARead-onlyIdempotent
Report Teradata workload management flow control events showing when and how much the system throttled or delayed queries due to resource constraints. Use when the user asks about system throttling, flow control delays, or how often the workload manager imposed restrictions. For how long individual users personally waited in queues, use dba_userDelay instead.
Arguments: start_date - The start date for the query range in YYYY-MM-DD format. end_date - The end date for the query range in YYYY-MM-DD format. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| end_date | Yes | The end date for the query range in YYYY-MM-DD format. | |
| start_date | Yes | The start date for the query range in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds that this is a system-level report rather than a per-user delay report, and mentions the persist behavior of materializing a volatile table. However, this is also present in the input schema and no additional behavioral traits like required privileges or side effects are disclosed beyond what annotations already imply.
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: the first sentence states purpose, the second gives usage context, and the third identifies the sibling alternative. The Arguments list is redundant with the schema but remains brief and scannable. No wasted words, though duplication with the input schema prevents a perfect score.
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 reporting tool with three parameters and no output schema. The description covers what the tool does, when to use it, which sibling to use instead, and all parameters. It does not describe the exact return fields, but the phrase 'showing when and how much' gives a reasonable indication. Overall, an agent has enough to 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 description coverage is 100%, so the input schema already documents start_date, end_date, and persist. The description's Arguments section simply repeats those descriptions verbatim, adding no new meaning or clarifying detail 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?
The description uses a specific verb and resource: 'Report Teradata workload management flow control events' and adds the scope 'showing when and how much the system throttled or delayed queries due to resource constraints.' It also differentiates from the sibling dba_userDelay by explicitly noting that individual user queue waits are not covered.
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 states explicit trigger conditions: 'Use when the user asks about system throttling, flow control delays, or how often the workload manager imposed restrictions.' It also names the alternative for the excluded case: 'For how long individual users personally waited in queues, use dba_userDelay instead.' This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_resusageSummaryDba ResusagesummaryARead-onlyIdempotent
Report system-wide resource consumption (CPU, IO, memory) broken down by time period, application, workload type, or complexity class. Use when the user asks for system-level resource breakdowns, workload profiles, or consumption trends over a date range — not tied to a specific database. For per-database or per-user impact within a named database, use dba_tableUsageImpact instead.
Arguments: user_name - User name to filter by. Leave empty for all users. LogDate - Log date to filter by in YYYY-MM-DD format. Leave empty for all dates. dayOfWeek - Day of week to filter by (1=Sunday, 2=Monday, ..., 7=Saturday). Leave empty for all days. hourOfDay - Hour of day to filter by (0-23). Leave empty for all hours. workloadType - Workload type to filter by (e.g., 'Batch', 'Interactive'). Leave empty for all workload types. workloadComplexity - Workload complexity to filter by (e.g., 'Simple', 'Medium', 'Complex'). Leave empty for all complexity levels. AppID - Application ID to filter by. Leave empty for all applications. no_days - Number of days to look back from today (e.g., 7, 30, 90). persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| AppID | No | Application ID to filter by. Leave empty for all applications. | |
| LogDate | No | Log date to filter by in YYYY-MM-DD format. Leave empty for all dates. | |
| no_days | No | Number of days to look back from today (e.g., 7, 30, 90). | |
| persist | No | If True, materializes result as a volatile table and returns table name | |
| dayOfWeek | No | Day of week to filter by (1=Sunday, 2=Monday, ..., 7=Saturday). Leave empty for all days. | |
| hourOfDay | No | Hour of day to filter by (0-23). Leave empty for all hours. | |
| user_name | No | User name to filter by. Leave empty for all users. | |
| workloadType | No | Workload type to filter by (e.g., 'Batch', 'Interactive'). Leave empty for all workload types. | |
| workloadComplexity | No | Workload complexity to filter by (e.g., 'Simple', 'Medium', 'Complex'). Leave empty for all complexity levels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context: it reports system-wide resource consumption, supports multiple breakdown dimensions, and the persist parameter's side effect (materializing a volatile table and returning its name) is disclosed. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a clear opening sentence, explicit usage guidance, and a compact parameter list. It is slightly longer than necessary because it repeats parameter descriptions already present in the schema, but the front-loaded purpose and usage guidance make it efficient and scannable.
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 reporting tool with 9 optional parameters and no output schema, the description covers the core purpose, usage context, and the one side-effecting parameter (persist). It does not describe the return format or result shape, but since there is no output schema and the tool is a report, a brief note on what the result looks like would be helpful. Still, the essential information for selecting and invoking the tool 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 100%, so the schema already documents all 9 parameters. The description repeats the parameter list but adds no new meaning beyond what the schema provides. Baseline 3 is appropriate because the schema carries the heavy lifting; the description does not need to compensate.
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 ('Report') and resource ('system-wide resource consumption') and enumerates the breakdown dimensions (time period, application, workload type, complexity class). It also explicitly distinguishes itself from dba_tableUsageImpact by noting it is not tied to a specific database, which differentiates it from the closest 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?
The description gives explicit when-to-use guidance: 'Use when the user asks for system-level resource breakdowns, workload profiles, or consumption trends over a date range — not tied to a specific database.' It also names the alternative tool (dba_tableUsageImpact) and the condition that selects it (per-database or per-user impact within a named database). This is clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_sessionInfoDba SessioninfoARead-onlyIdempotent
Report currently active session information for a specific user or all users. Use when the user asks about open connections, active sessions, or currently logged-in users. You may call with the default '*' to show all sessions when no specific user is mentioned — no clarification required for this tool.
Arguments: user_name - User name to analyze. Use '*' to get all users. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| user_name | No | User name to analyze. Use '*' to get all users. | * |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds meaningful behavioral context beyond that, particularly the persist behavior: materializing results as a volatile table and returning the table name. This is a real side effect the agent should know. It could mention output format details, but the added context is solid.
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: a clear purpose statement, a usage trigger, a default-behavior note, and a minimal Arguments block. Every sentence earns its place and there is no filler or duplication beyond the necessary parameter repetition.
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, has only two optional parameters, full schema coverage, and safety annotations. The description covers purpose, usage triggers, defaults, and the persist side effect. The only notable gap is that no output shape is described despite there being no output schema, but this is minor for a reporting tool of this 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?
Schema description coverage is 100%, and the input schema already documents both parameters fully. The description repeats the same parameter explanations, adding no new semantic meaning beyond usage context. This meets the baseline for fully schema-documented 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 a specific verb ('Report') and resource ('currently active session information for a specific user or all users'). This clearly differentiates it from sibling DBA tools like dba_userSqlList or dba_tableSpace, which target different resources.
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 explicitly defines when to use the tool: 'when the user asks about open connections, active sessions, or currently logged-in users.' It also gives guidance on the default '*' behavior and states that no clarification is required. It lacks explicit when-not-to-use or alternative tool routing, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_systemSpaceDba SystemspaceARead-onlyIdempotent
Show total disk space usage across the entire Teradata system, aggregated over all databases. Use when the user asks about warehouse-wide storage, total system capacity, or overall disk consumption across all databases. For a single named database, use dba_databaseSpace. For table-level details within a database, use dba_tableSpace.
Arguments: persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety. The description adds useful behavioral context beyond that: the persist parameter 'materializes result as a volatile table and returns table name', which is a concrete side effect not implied by the annotations. It does not elaborate on volatile table lifetime, but that is a minor 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?
The description is front-loaded with the core purpose, then gives usage conditions, sibling alternatives, and the parameter explanation. Every sentence earns its place; there is no fluff or repetition.
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 aggregate tool with one optional parameter, the description is nearly complete. It covers scope, when to use, alternatives, and the persist behavior. With no output schema, it could arguably state the return format when persist=false, but that is reasonably implied by 'Show total disk space usage.' Minor gap only.
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 100%, so the baseline is 3. The description's persist line repeats the schema description almost verbatim, adding no additional semantic value beyond what the schema already 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?
The description states 'Show total disk space usage across the entire Teradata system, aggregated over all databases' — a specific verb, resource, and scope. It also explicitly differentiates from siblings by naming dba_databaseSpace for single-database queries and dba_tableSpace for table-level details.
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 provides explicit when-to-use guidance: 'Use when the user asks about warehouse-wide storage, total system capacity, or overall disk consumption across all databases.' It also names the exact alternatives and the conditions that route to them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_tableSpaceDba TablespaceARead-onlyIdempotent
Show table-level disk space usage within a specific Teradata database, ranked by size. Use when the user asks which tables are largest or consuming the most storage within a named database. NEVER call this tool with an empty database_name — if the user's message does not explicitly name a database, ask which database they want before calling. For space allocated to a whole database, use dba_databaseSpace. For total system-wide storage, use dba_systemSpace.
Arguments: database_name - Database name. Required — do not pass empty string. table_name - Table name filter. Leave empty for all tables. top_n - Limit results to top N largest tables by space. Set to 0 for no limit (default: 0). exclude_system - Exclude system databases and tables. Set to 'Y' to exclude, 'N' to include all (default: 'N'). persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | Limit results to top N largest tables by space. Set to 0 for no limit (default: 0). | |
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | No | Table name filter. Leave empty for all tables. | |
| database_name | Yes | Database name. Required — do not pass empty string. | |
| exclude_system | No | Exclude system databases and tables. Set to 'Y' to exclude, 'N' to include all (default: 'N'). | N |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, lowering the burden on the description. The description adds useful behavioral context: results are ranked by size, persist materializes a volatile table and returns its name, and empty database_name is an invalid call. No contradiction with annotations is present.
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 description is front-loaded with purpose, usage trigger, and exclusion guidance before the arguments list. The argument list is somewhat redundant with the schema, but it is clearly formatted and does not undermine readability.
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 five parameters, no output schema, and several related siblings, the description is fully sufficient. It covers what the tool does, when to use it, how to avoid invalid calls, which siblings to route to, and the meaning of every parameter including the persist 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 100%, so the schema fully documents every parameter. The description essentially repeats the same parameter information rather than adding new meaning beyond the schema, which lands it at the baseline score.
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: 'Show table-level disk space usage within a specific Teradata database, ranked by size.' It also explicitly distinguishes itself from sibling tools dba_databaseSpace and dba_systemSpace by scope, so an agent can select it accurately.
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 direct trigger conditions: 'Use when the user asks which tables are largest or consuming the most storage within a named database.' It explicitly warns against calling with an empty database_name, instructs the agent to ask for a database if unnamed, and names alternatives for database-level and system-level space.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_tableSqlListDba TablesqllistARead-onlyIdempotent
Retrieve SQL statements that have been executed against a specific named table. Use when the user asks what queries have run against a particular table. ONLY call when the user has explicitly named a specific table — if no table name is in the message, ask for clarification. Do NOT use for SQL history by user — use dba_userSqlList when the user asks what queries a specific person has been running.
Arguments: table_name - Table name to search for no_days - Number of days to look back persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| no_days | No | Number of days to look back | |
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, and the description adds meaningful behavioral context beyond those: the requirement for an explicit table name, and the persist parameter's effect of materializing a volatile table and returning a table name. It does not contradict the annotations, as the volatile table appears to be ephemeral rather than a persistent write.
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 guidance is front-loaded in the first two sentences and the exclusion is stated immediately. The Arguments section is somewhat redundant with the input schema, but it is brief and does not obscure the tool's purpose. Overall, every important behavioral rule 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?
Given there is no output schema, the description reasonably covers what the tool does, when to use it, when not to use it, and the key parameter behaviors including persist. It does not detail the exact return shape of the SQL statement list, but the tool name and core description make that reasonably inferable. This is complete enough for reliable 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 100%, so the schema already documents all three parameters. The description repeats the parameter descriptions almost verbatim without adding extra semantic depth, such as value formats, edge cases, or more concrete examples. A baseline 3 is appropriate because the description does not meaningfully surpass 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 opens with a specific verb and resource: 'Retrieve SQL statements that have been executed against a specific named table.' It also explicitly distinguishes itself from dba_userSqlList by stating this is not for user-based SQL history, making the tool's scope 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 when-to-use guidance: 'Use when the user asks what queries have run against a particular table.' It also provides a clear exclusion with an alternative: 'Do NOT use for SQL history by user — use dba_userSqlList.' The strict condition about requiring an explicit table name, and asking for clarification otherwise, is exceptionally clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_tableUsageImpactDba TableusageimpactARead-onlyIdempotent
Identify which users and tables are driving the most query and resource activity within a specific Teradata database. Use when the user asks who is hitting a named database hardest, which users are most active, or which tables generate the most load. ONLY call when the user has specified a database name — if no database name appears in the message, ask for clarification. For system-wide CPU, IO, and memory metrics by time period or application, use dba_resusageSummary instead.
Arguments: database_name - Database name to analyze. Required — do not pass empty string. user_name - User name to analyze. Leave empty for all users. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| user_name | No | User name to analyze. Leave empty for all users. | |
| database_name | Yes | Database name to analyze. Required — do not pass empty string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful behavior beyond annotations: the persist parameter's side effect of materializing a volatile table and returning its name, plus the guardrail to ask for a database name when missing. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage guidance are front-loaded and tight, with an explicit alternative and guardrail. The 'Arguments' section is redundant with the input schema, which is a minor efficiency loss, but it does not bloat the description significantly.
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 largely complete for a read-only analytics tool: it states purpose, triggers, prerequisites, and the behavior of the persist flag. It does not describe the normal (non-persist) return value shape, but given the clear purpose and annotations, this is not a critical 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 100%, so the baseline is 3. The description repeats the parameter documentation without adding deeper meaning beyond telling the agent that database_name is required and must not be empty; this adds little over 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 opens with a specific verb and resource: 'Identify which users and tables are driving the most query and resource activity within a specific Teradata database.' It clearly differentiates the tool from siblings by scoping to a named database and by naming the alternative for system-wide metrics.
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 trigger conditions are given ('who is hitting a named database hardest, which users are most active, or which tables generate the most load'), a hard precondition is stated (database name required, else ask for clarification), and an alternative tool, dba_resusageSummary, is named for different use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_userDelayDba UserdelayARead-onlyIdempotent
Report how long Teradata users waited in the query queue before their queries began executing. Use when the user asks about user wait times, queue delays, or how long users had to wait. For system-level throttling and workload management flow control events, use dba_flowControl instead.
Arguments: start_date - The start date for the query range in YYYY-MM-DD format. end_date - The end date for the query range in YYYY-MM-DD format. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| end_date | Yes | The end date for the query range in YYYY-MM-DD format. | |
| start_date | Yes | The start date for the query range in YYYY-MM-DD format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful context about queue-based wait behavior and excludes flow control, but does not elaborate on aggregation, units, or response shape. This is adequate but not deeply transparent.
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 guidance is front-loaded in two clear sentences followed by a sibling alternative. The argument list is slightly redundant given the schema already documents all parameters, but it is compact and does not undermine clarity.
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 reporting tool with a simple date-range interface and no output schema, this description is largely complete: it states what is measured, when to use it, how to parameterize it, and which sibling to choose instead. It could mention what the returned data looks like, but this is a minor 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 100%, and the description's argument list largely duplicates the schema text. It adds no new semantic meaning beyond what the schema already provides, so baseline 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: 'Report how long Teradata users waited in the query queue before their queries began executing.' It clearly distinguishes this tool from dba_flowControl by naming 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?
Explicitly tells the agent when to use this tool ('user wait times, queue delays, or how long users had to wait') and when to use dba_flowControl instead ('system-level throttling and workload management flow control events'). No inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dba_userSqlListDba UsersqllistARead-onlyIdempotent
Retrieve SQL statements executed by a specific named user. Use when the user asks what queries a particular person or account has been running. ONLY call when the user has explicitly named a specific user account — if no user name appears in the message, ask for clarification. NEVER call with an empty user_name. Do NOT use for SQL history by table — use dba_tableSqlList when the user asks about queries against a specific table.
Arguments: user_name - User name to filter by. Required — do not pass empty string. no_days - Number of days to look back persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| no_days | No | Number of days to look back | |
| persist | No | If True, materializes result as a volatile table and returns table name | |
| user_name | Yes | User name to filter by. Required — do not pass empty string. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds meaningful behavioral detail beyond them: it warns against empty user_name, instructs the agent to ask for clarification when no user is named, and discloses that persist=True materializes a volatile table and returns its name. This is useful, non-obvious 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?
The description is compact, front-loaded with the core behavior, and uses structured argument notes. The Arguments block partly duplicates the input schema, but it is brief and earns its place by emphasizing the required user_name constraint and the persist side effect.
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 full schema coverage and no output schema, this description is complete. It covers purpose, invocation conditions, exclusions, an alternative tool, required parameter behavior, and the main optional side effect. An agent has enough context to decide when and how to call 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 100%, so the schema already documents all three parameters. The description restates those descriptions and adds the 'do not pass empty string' guard, but it does not add substantially new semantic detail such as value formats, bounds, or examples.
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: 'Retrieve SQL statements executed by a specific named user.' It clearly distinguishes this tool from dba_tableSqlList, which handles SQL history by table, and from the other siblings by anchoring on a named user account.
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 when-to-use guidance (user asks what queries a person/account has been running), a hard precondition (must name a specific user, otherwise ask for clarification), and an explicit alternative: use dba_tableSqlList for table-focused SQL history. This leaves little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_analyseDatabaseGraph AnalysedatabaseARead-onlyIdempotent
Composite graph analysis — runs findRootObjects, connectedComponents, detectCycles, and bfsLevels in a single MCP call with ONE shared edge fetch.
This tool eliminates the scalability bottleneck of serial MCP round- trips by combining four graph analyses that would otherwise require four separate tool calls, each independently fetching the same edge set from Teradata.
Performance vs individual tools:
1 SQL round-trip instead of 4 (shared edge fetch)
1 MCP response instead of 4 (eliminates stdio serialisation overhead)
Same algorithmic complexity (O(V+E) BFS, O(α·N) Union-Find, O(V+E) DFS)
In-memory edge sharing: all analyses operate on the same Python list
Use this for:
Full database migration readiness assessment
Pre-migration cycle + root + wave analysis in one call
Dashboard data population (all four analyses needed simultaneously)
Any workflow that would otherwise call 3+ individual graph tools
Arguments: container_pattern - str: CSV LIKE patterns for container scope. Supports wildcards (%) and CSV format. Examples: '%SALES%', '%SALES%,%FINANCE%', 'PROD_%'
CRITICAL: STRING type, not array.
CORRECT: container_pattern="%SALES%,%FINANCE%"
WRONG: container_pattern=["%SALES%", "%FINANCE%"]exclude_objects - str: CSV LIKE patterns to exclude. Default: '' (no exclusions)
top_n_roots - int: Number of top root objects (by downstream dependent count) to include in BFS wave analysis. Default: 4
max_depth_down - int: Maximum downstream BFS hops from roots. Default: 10
max_depth_up - int: Maximum upstream BFS hops from roots. 0 = skip upstream analysis. Default: 0
edge_repository - str: Edge repository view/table conforming to the Graph Edge Contract (Src_Container_Name, Src_Object_Name, Src_Kind, Tgt_Container_Name, Tgt_Object_Name, Tgt_Kind columns). Call graph_edgeContractDDL to generate one. Required parameter — no default.
Returns: ResponseType: single response containing all four analyses:
{ "root_objects": { "objects": [...], "summary": {...} }, "components": { "node_details": [...], "summaries": [...], "stats": [...] }, "cycles": { "details": [...], "summaries": [...], "stats": [...] }, "bfs_waves": { "nodes": [...], "cycle_candidates": [...], "summary": {...} }, "edge_stats": { "total_edges": N, "fetch_time_ms": N } }
Example calls:
Full analysis of Sales and Finance databases
handle_graph_analyseDatabase( conn=connection, container_pattern="%SALES%,%FINANCE%", edge_repository="MY_LINEAGE_DB.EdgeRepository" )
Single database family with top 8 roots
handle_graph_analyseDatabase( conn=connection, container_pattern="%FINANCE%", top_n_roots=8, edge_repository="MY_LINEAGE_DB.EdgeRepository" )
Exclude sandbox schemas
handle_graph_analyseDatabase( conn=connection, container_pattern="PROD_%,STAGE_%", exclude_objects="SANDBOX%,%.temp_%", edge_repository="MY_LINEAGE_DB.EdgeRepository" )
| Name | Required | Description | Default |
|---|---|---|---|
| top_n_roots | No | ||
| max_depth_up | No | ||
| max_depth_down | No | ||
| edge_repository | No | ||
| exclude_objects | No | ||
| container_pattern | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, and the description does not contradict them—it clearly describes a read-only composite analysis. Beyond the annotations, it discloses the internal execution (shared edge fetch, in-memory sharing), the exact return structure, and performance characteristics (1 SQL round-trip vs 4). It also details the critical type requirement for container_pattern (string not array), which is essential 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?
The description is long but densely packed with essential information: purpose, performance rationale, use cases, parameter documentation, return structure, and examples. It is front-loaded with the composite nature and benefit. Minor redundancy exists in the performance bullet points and the examples, but every section earns its place. The use of headers and bullet lists improves 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?
Given the tool's complexity (composite of four analyses, 6 parameters, no output schema), the description is exceptionally complete. It explains the return structure with a concrete JSON example, provides three usage examples covering edge cases (exclusions, custom top_n_roots), and explicitly directs the user to graph_edgeContractDDL for the required edge_repository. The annotations cover read-only and idempotent behavior, leaving nothing critical unexplained for an agent 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%, so the description must fully document parameters. It does: for each parameter it gives type, default, purpose, and examples, with explicit syntax guidance for container_pattern (wildcards, CSV format) and edge_repository contract. The description goes well beyond the schema by explaining the semantics of max_depth_up (0 = skip) and the required nature of edge_repository despite schema listing it with a 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 explicitly states the composite nature ('runs findRootObjects, connectedComponents, detectCycles, and bfsLevels in a single MCP call') and the key benefit of a shared edge fetch. It clearly identifies the resource (database lineage graph) and the specific analyses performed, distinguishing it from the individual sibling tools. The verb 'runs' and the enumeration of sub-analyses leave no ambiguity about what the 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?
The description provides explicit 'Use this for' scenarios (migration readiness, pre-migration analysis, dashboard data population) and contrasts with individual tools by explaining the performance benefit of avoiding multiple calls. It implicitly tells the agent to prefer this tool when multiple analyses are needed simultaneously, and refers to sibling tools (e.g., graph_edgeContractDDL) for required edge_repository. This is strong guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_bfsLevelsGraph BfslevelsARead-onlyIdempotent
Compute BFS shortest-path hop distances from one or more root nodes.
Pure-Python implementation — no stored procedure required.
WHEN TO USE THIS TOOL vs graph_traceLineage:
Use graph_bfsLevels when asked to:
Sequence objects for deployment or migration (ORDER BY downstream_level gives correct topological deployment order for root objects)
Group objects into migration waves (nearest_root identifies which of the input root tables each object belongs to)
Find which migration root table each object is closest to across a multi-root migration scope
Identify cycle members by depth (direction='BOTH' nodes with unequal absolute upstream/downstream levels are cycle candidates)
Count objects within N hops of a change (blast-radius sizing)
Answer "how far is object X from the migration root tables?"
Do NOT use graph_bfsLevels for general lineage tracing, impact path analysis, or questions about which specific objects depend on which. Use graph_traceLineage for those — it returns the full edge set with relationship detail. graph_bfsLevels returns distances and wave groupings, not dependency paths or edge detail.
KEY DISTINCTION — root_node_list accepts EXACT FQ names only (no wildcards). Use graph_findRootObjects first to identify the seed objects, then pass their exact FQ names here.
Arguments: root_node_list - str: CSV of exact fully-qualified root node names. No wildcards — exact names only.
SINGLE ROOT:
'DEV01_StGeo_STD_T.mortgage_account'
MULTIPLE ROOTS (CSV):
'DEV01_StGeo_STD_T.mortgage_account,
DEV01_StGeo_STD_T.mortgage_borrower,
DEV01_StGeo_STD_T.mortgage_property'
CRITICAL: Exact FQ names, no wildcards.
Use graph_findRootObjects or
graph_traceLineage first to discover names.max_depth_up - int: Maximum upstream hops to traverse. 0 = skip upstream analysis entirely. Default: 10
Upstream means "what this object DEPENDS ON" —
its sources, prerequisites, and ancestors.
For root objects with in-degree zero, upstream_level
will be NULL for all non-root nodes (correct).max_depth_down - int: Maximum downstream hops to traverse. 0 = skip downstream analysis entirely. Default: 10
Downstream means "what DEPENDS ON this object" —
its consumers, dependents, and impact radius.
For root objects with in-degree zero, downstream_level
will show positive values for all consumers (correct).exclude_objects - str: CSV of FQ object name LIKE patterns to exclude. Matched against both Src and Tgt sides of every edge. Python fnmatch is used for pattern matching (% → *). Example: 'DFJ%,C_D02%,%.temp_%' Default: '' (no exclusions)
include_containers - str: CSV of container name LIKE patterns to include. Only edges where BOTH Src and Tgt containers match at least one pattern are traversed. Python fnmatch used for matching (% → *). Empty = all containers included. Example: 'DEV01_StGeo%,MF_STGEO%,TABLEAU%,POWERBI%' Default: '' (all containers)
edge_repository - str: Edge repository view/table conforming to the Required parameter — no default.
Returns: ResponseType: formatted response with BFS node results + metadata. Schema is identical to handle_graph_bfsLevels (SP-based tool).
Response structure: { "nodes": [ { "node": "DEV01_StGeo_STD_T.mortgage_account", "container_name": "DEV01_StGeo_STD_T", "object_name": "mortgage_account", "object_kind": "Table", "upstream_level": None, // None (NULL) if unreachable or skipped "downstream_level": 0, // 0 for root, positive for consumers "nearest_root": "DEV01_StGeo_STD_T.mortgage_account", "direction": "ROOT", // ROOT / U / D / BOTH "is_root": "Y" }, ... ], "cycle_candidates": [...], // direction='BOTH' nodes with unequal // absolute upstream/downstream levels "summary": { "total_nodes": 46, "root_nodes": 3, "upstream_only": 12, "downstream_only": 28, "both_directions": 3, "cycle_candidates": 1, "max_upstream_depth": 4, "max_downstream_depth": 5, "nodes_per_nearest_root": {"DB.Root1": 20, "DB.Root2": 26}, "object_kind_counts": {"Table": 10, "View": 22, "Macro": 8, ...} } }
direction values: ROOT - One of the input root nodes U - Reachable upstream only (negative upstream_level) D - Reachable downstream only (positive downstream_level) BOTH - Reachable in both directions — possible cycle member. Unequal absolute levels indicate a back-edge (cycle). Equal absolute levels indicate a shared dependency.
Technical Implementation Notes:
One SQL round-trip to fetch all edges matching the container/exclusion filters. All BFS computation is then done in Python memory.
Standard queue-based BFS (O(V+E)) — optimal for unweighted graphs. This is more correct than the original Bellman-Ford style SQL relaxation loop that the SP inherited from the notebook.
Multi-source BFS: all root nodes are seeded simultaneously at level 0. Each non-root node settles at the distance to its nearest root, with ties broken deterministically by lexicographic root name order.
Upstream BFS follows Src→Tgt edges to discover Src-side ancestors.
Downstream BFS follows Tgt→Src edges to discover Tgt-side consumers.
This direction convention matches the corrected SP (Option B fix): upstream_level = NULL for root objects with in-degree zero (correct) downstream_level = positive for all consumers (correct)
Filter application order:
SQL WHERE clause: fetch only edges matching include_containers (both Src and Tgt containers must match at least one pattern)
Python post-filter: exclude edges where either endpoint matches an exclude_objects pattern (applied before building adjacency)
BFS depth cap: enforced during queue processing
Node metadata (container_name, object_name, object_kind) is derived from the edge set and stored in a node registry during the fetch phase.
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth_up | No | ||
| max_depth_down | No | ||
| root_node_list | Yes | ||
| edge_repository | No | ||
| exclude_objects | No | ||
| include_containers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description never contradicts them. It adds substantial behavioral context beyond the annotations: multi-source BFS with deterministic lexicographic tie-breaking, direction conventions (upstream = dependencies, downstream = consumers), the upstream_level=NULL semantic for in-degree-zero roots, filter application order (SQL WHERE → Python post-filter → BFS depth cap), single SQL round-trip, and O(V+E) complexity. These are exactly the subtle behaviors an agent cannot infer 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?
This is a long description, but it is sharply structured with clear headers (purpose, when-to-use, key distinction, arguments, returns, technical notes) and front-loads the critical scoping constraint (BFS distances, not lineage paths) before parameter details. The length is largely justified because the schema provides zero parameter documentation and there is no output schema. The technical implementation notes are somewhat verbose (e.g., the Option B fix history) and could be trimmed, but every section earns its place for an agent needing to call this correctly.
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-parameter tool with 0% schema coverage, no output schema, and no enums, this description is remarkably complete: every parameter has semantics, defaults, and examples; the response shape is shown with a full JSON sample including direction values and cycle_candidates semantics; and edge cases (NULL levels for in-degree-zero roots, tie-breaking, filter order) are documented. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 delivers detailed semantics for all six parameters: CSV syntax with concrete single-root and multi-root examples for root_node_list, the '0 = skip' sentinel for both depth parameters, fnmatch %→* pattern semantics for exclude_objects and include_containers, and container-matching rules. It loses a point because of a schema/description conflict: the schema declares edge_repository with default '' while the description claims it is 'Required parameter — no default,' which could mislead an agent deciding whether to supply 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?
Opens with a precise verb+resource statement: 'Compute BFS shortest-path hop distances from one or more root nodes.' It then distinguishes itself from graph_traceLineage by explicitly stating what it returns ('distances and wave groupings, not dependency paths or edge detail'). An agent can immediately tell this apart from its graph siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains a dedicated 'WHEN TO USE THIS TOOL vs graph_traceLineage' section listing six concrete use cases (deployment ordering, migration waves, nearest-root assignment, cycle candidates, blast-radius counting, distance queries) and an explicit 'Do NOT use' block naming the alternative. The 'KEY DISTINCTION' section further routes the agent to graph_findRootObjects for name discovery before calling. This is exactly the explicit when/when-not/alternatives guidance the rubric rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_connectedComponentsGraph ConnectedcomponentsARead-onlyIdempotent
Identify all Weakly Connected Components (WCC) in the dependency graph.
Pure-Python implementation — no stored procedure required. Issues a single SQL SELECT to fetch the scoped edge set, then performs Union-Find WCC partitioning entirely in the MCP server process.
A connected component is a maximal set of nodes where every node can reach every other node when edge direction is ignored. This partitions the graph into isolated sub-graphs.
Use this tool for:
Understanding graph structure and partitioning
Identifying isolated sub-graphs
Scoping downstream impact analysis to a single component
Pre-filtering before cycle detection (cycles exist only within a component)
Identifying "islands" of related objects for migration or refactoring
Estimating blast radius
Arguments: container_pattern - str: CSV LIKE patterns for container scope. Supports wildcards (%) and CSV format. Examples: '%WBC%', '%WBC%,%StGeo%', 'DEV01_%,DEV02_%'
CRITICAL: STRING type, not array.
CORRECT: container_pattern="%WBC%,%StGeo%"
WRONG: container_pattern=["%WBC%", "%StGeo%"]exclude_objects - str: CSV LIKE patterns to exclude. Matches against container name (or DB.Object if the pattern contains a dot). Default: '' (no exclusions)
edge_repository - str: Edge repository view/table conforming to the Graph Edge Contract (Src_Container_Name, Src_Object_Name, Src_Kind, Tgt_Container_Name, Tgt_Object_Name, Tgt_Kind columns). For AI-Native Data Products use: '{ProductName}_Semantic.lineage_graph' Call graph_edgeContractDDL to generate a new one. Required — no default.
Returns: ResponseType: formatted response with connected component results.
Response structure: { "node_details": [...], // One row per node with Component_Id "component_summaries": [...], // One row per component "summary_stats": [...] // Single aggregate row }
node_details row fields: Node_FQ, DatabaseName, ObjectName, Component_Id, Object_Kind
component_summaries row fields: Component_Id, Node_Count, Node_List
summary_stats row fields: Component_Count, Node_Count, Edge_Count, Largest_Component, Smallest_Component, Singleton_Count, Summary_Message
| Name | Required | Description | Default |
|---|---|---|---|
| edge_repository | No | ||
| exclude_objects | No | ||
| container_pattern | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses key behavioral details: it is a pure-Python implementation, requires no stored procedure, issues a single SQL SELECT, and runs Union-Find in the MCP server process. It also documents the full response structure, which is especially valuable since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with headers, bullets, examples, and a return-structure breakdown. Every section adds necessary information for correct invocation, and the critical parameter caveat is highlighted.
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's complexity, three parameters, and absent output schema, the description is complete: it covers the algorithm, scope, parameter contracts, response fields, and use cases. 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 full burden, and it does so thoroughly. Each parameter gets semantics, examples, defaults, matching behavior, and a critical STRING-not-array warning for container_pattern. The edge_repository contract and how to generate it via graph_edgeContractDDL are also 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?
The description opens with a specific verb and resource: 'Identify all Weakly Connected Components (WCC) in the dependency graph.' It then defines the component semantics clearly, which distinguishes this from sibling graph tools like graph_detectCycles, graph_findRootObjects, and graph_traceLineage.
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 'Use this tool for' bullet list gives explicit application contexts, including pre-filtering before cycle detection and blast-radius estimation. It does not name specific sibling alternatives or state when not to use it, but the guidance is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_detectCyclesGraph DetectcyclesARead-onlyIdempotent
Detect circular dependencies (cycles) in the dependency graph.
Pure-Python implementation — no stored procedure required. Issues a single SQL SELECT to fetch the scoped edge set, then performs WCC partitioning followed by iterative DFS cycle detection entirely in the MCP server process.
Use this tool for:
Validating graph integrity (DAG property)
Finding objects that form circular references
Identifying stub-then-replace code patterns
Debugging topological sort hangs
Pre-deployment cycle checks
Arguments: container_pattern - str: CSV LIKE patterns for container scope. Supports wildcards (%) and CSV format. Examples: 'DFJ%' — single database family '%WBC%,%StGeo%' — multiple families 'DEV01_%,DEV02_%' — multiple prefixes
exclude_objects - str: CSV LIKE patterns to exclude from the scan. Matches against container name (or DB.Object if the pattern contains a dot). Default: '' (no exclusions)
edge_repository - str: Edge repository view/table conforming to the Graph Edge Contract (Src_Container_Name, Src_Object_Name, Src_Kind, Tgt_Container_Name, Tgt_Object_Name, Tgt_Kind columns). For AI-Native Data Products use: '{ProductName}_Semantic.lineage_graph' Call graph_edgeContractDDL to generate a new one. Required — no default.
Returns: ResponseType: formatted response with cycle detection results.
Response structure: { "cycle_details": [...], // One row per node per cycle "cycle_summaries": [...], // One row per cycle with path string "summary_stats": [...] // Single aggregate row }
cycle_details row fields: Cycle_Id, Cycle_Pos, Node_FQ, Cycle_Length, Component_Id
cycle_summaries row fields: Cycle_Id, Cycle_Length, Component_Id, Cycle_Path
summary_stats row fields: Cycle_Count, Total_Nodes_In_Cycles, Components_With_Cycles, Edge_Count, Components_Scanned, Summary_Message
| Name | Required | Description | Default |
|---|---|---|---|
| edge_repository | No | ||
| exclude_objects | No | ||
| container_pattern | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing that it is a pure-Python implementation, issues a single SQL SELECT, runs WCC partitioning and iterative DFS entirely in the MCP server process, and returns a specific response structure. This gives an agent a clear model of execution cost and 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?
The description is long but tightly structured: summary, use cases, arguments, and return format. Each section carries necessary information, with examples and field lists that an agent needs for correct invocation. There is no filler or repetition.
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 supplies a detailed response structure, field names, parameter examples, and the expected edge_repository format. It also references graph_edgeContractDDL for generating the contract, making it self-sufficient for correct use.
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 the input schema has 0% description coverage, the description's Arguments section fully documents all three parameters with types, defaults, wildcard/CSV semantics, examples, requiredness, and the edge repository contract. This fully compensates for the sparse 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?
Description opens with a precise verb+resource: 'Detect circular dependencies (cycles) in the dependency graph.' It clearly distinguishes this from sibling graph tools like traceLineage or connectedComponents by naming the exact outcome (cycles) and the method (WCC partitioning + DFS cycle detection).
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 an explicit 'Use this tool for' list covering graph integrity validation, circular reference finding, stub-then-replace patterns, topo-sort debugging, and pre-deployment checks. It does not name alternative sibling tools or state when not to use it, 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.
graph_edgeContractDDLGraph EdgecontractddlARead-onlyIdempotent
Generate DDL for a Graph Edge Contract-conforming table or view.
This tool does NOT require a database connection — it generates DDL text from templates. No SQL is executed. The conn parameter is accepted for ModuleLoader calling convention compatibility but is not used.
Required columns in the generated schema (6): Src_Container_Name, Src_Object_Name, Src_Kind, Tgt_Container_Name, Tgt_Object_Name, Tgt_Kind
Optional enrichment columns (2): Edge_Relationship — nature of the edge (ETL_INPUT, ETL_OUTPUT, DIRECT…) Transformation_Type — process category (ETL, FEATURE_ENG, AGGREGATION…) These are ignored by graph analysis tools but useful for visualisation.
AI-Native Data Product shortcut: If you are working within an AI-Native Data Product, the view {ProductName}Semantic.lineage_graph (Observability Module v1.5) already conforms to this contract. You do not need to generate DDL — pass that view's fully-qualified name directly as edge_repository on any graph* tool. Example: edge_repository='StGeoMortgage_Semantic.lineage_graph'
Arguments: conn: TeradataConnection (unused — accepted for ModuleLoader compatibility). target_database: Database in which to create the edge repository. For AI-Native Data Products this is typically {ProductName}_Semantic. Example: 'StGeoMortgage_Semantic' object_name: Name for the edge table/view. Default: 'EdgeRepository' output_type: 'TABLE' or 'VIEW'. TABLE: generates CREATE TABLE DDL + separate sample DML. Includes all 6 required + 2 optional columns. VIEW: generates a CREATE VIEW template for mapping an existing lineage source to all 8 contract columns. Default: 'TABLE'
Returns: list[dict]: Response payload containing: - ddl: DDL script (CREATE TABLE/VIEW + COMMENTs) - sample_dml: Sample INSERT statements + validation query (TABLE only; absent for VIEW) - output_type: 'TABLE' or 'VIEW' - contract_version: Contract version string
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | No | Name for the edge table/view. Default: 'EdgeRepository' | EdgeRepository |
| output_type | No | 'TABLE' or 'VIEW'. TABLE: generates CREATE TABLE DDL + separate sample DML. Includes all 6 required + 2 optional columns. VIEW: generates a CREATE VIEW template for mapping an existing lineage source to all 8 contract columns. Default: 'TABLE' | TABLE |
| target_database | Yes | Database in which to create the edge repository. For AI-Native Data Products this is typically {ProductName}_Semantic. Example: 'StGeoMortgage_Semantic' |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that the conn argument is ignored, output is template text, and TABLE vs VIEW behavior differs (sample DML only for TABLE). It also enumerates the response payload keys, so the agent knows exactly what to expect.
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-organized with sections and a one-line summary up front, and the AI-Native shortcut is valuable context. However, it is somewhat redundant with the schema's parameter descriptions and includes the confusing conn argument.
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 purpose, non-execution behavior, column contract, the AI-Native product shortcut, argument defaults, and return payload structure. With an output schema also present and annotations already declaring read-only/idempotent behavior, nothing essential 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 100%, so the schema already explains target_database, object_name, and output_type. The description mostly repeats that content and, worse, lists a conn argument that is absent from the input schema with additionalProperties:false, which could mislead an agent into passing an invalid parameter.
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 states a precise action ('Generate DDL') and resource ('Graph Edge Contract-conforming table or view'). It clearly distinguishes this from the sibling graph_* analysis tools by being a DDL-generation utility rather than a graph traversal/analysis 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 explicitly says no database connection is required and no SQL is executed, so the agent knows when this is a safe offline generation step. It also gives a concrete alternative: for AI-Native Data Products, use the existing lineage_graph view directly and pass its fully-qualified name rather than generating DDL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_findRootObjectsGraph FindrootobjectsARead-onlyIdempotent
Find root objects (objects with no upstream dependencies) in specified containers.
Root objects are ideal starting points for downstream impact analysis as they represent the foundational data sources that nothing else depends upon.
Use this for:
Finding starting points for downstream impact analysis
Identifying source tables and base objects in data pipelines
Discovering independent objects that can be safely analysed in isolation
Understanding data flow origins in a schema or database
Planning migration or refactoring by identifying foundation objects
Arguments: container_pattern - str: Database/schema pattern(s) to search. SUPPORTS WILDCARDS (%) and CSV.
IMPORTANT: This is a STRING parameter (type: str), not an array.
Pass multiple patterns as a single comma-separated string.
SINGLE CONTAINER:
'DEV01_StGeo_STD_T' - Specific database
WILDCARDS (%):
'%WBC%' - All databases containing WBC
'DEV01_%' - All databases starting with DEV01_
'%_STD_T' - All databases ending with _STD_T
MULTIPLE CONTAINERS (CSV format):
'%WBC%,%StGeo%' - All WBC and StGeo databases
'DEV01_StGeo_STD_T,DEV02_WBC_STD_T' - Specific databases
'DEV01_%,DEV02_%' - All DEV01 and DEV02 databases
WHITESPACE HANDLING:
Whitespace is automatically trimmed, so these are equivalent:
✅ '%WBC%,%StGeo%' (no spaces)
✅ '%WBC%, %StGeo%' (spaces after commas - OK)
HOW TO PASS IN CODE:
Python: container_pattern="%WBC%,%StGeo%"
JSON: {"container_pattern": "%WBC%,%StGeo%"}
CRITICAL: This is a STRING type parameter.
✅ CORRECT: Pass as string: container_pattern="%WBC%,%StGeo%"
❌ WRONG: Pass as array: container_pattern=["%WBC%", "%StGeo%"]exclude_objects - str: Comma-separated list of patterns to exclude (SERVER-SIDE filter). Matches against DatabaseName.ObjectName format.
Common exclusion patterns:
'PRD_%,PROD_%' - Exclude production databases
'%.temp_%,%.bak_%' - Exclude temporary and backup objects
'DFJ%,C_D02%' - Exclude personal/sandbox schemas
Performance: Reduces result set and improves query time
Default: '' (empty string = no exclusions)edge_repository - str: Edge repository table/view conforming to the Required parameter — no default.
object_types - str: Comma-separated list of object types to include (optional filter). Examples: 'T' (tables), 'V' (views), 'P' (procedures), 'M' (macros) Multiple: 'T,V' (tables and views only) Empty = all object types included Default: '' (all types)
return_format - str: Output format: 'detailed' or 'summary' 'detailed' (default): Full object list with metadata 'summary': High-level statistics and counts only Default: 'detailed'
Returns: ResponseType: formatted response with root objects + metadata
Example queries that trigger this tool:
"Which objects in WBC and StGeo databases have no dependencies?"
"Find root objects in DEV01 databases"
"What are the starting points for impact analysis in StGeo?"
"Show me base tables with no upstream dependencies"
"Which objects should I start analysing for downstream impact?"
Example calls:
Find root objects in WBC and StGeo databases
handle_graph_findRootObjects( conn=connection, container_pattern="%WBC%,%StGeo%" )
Find only root tables (no views/procedures)
handle_graph_findRootObjects( conn=connection, container_pattern="DEV01_%", object_types="T" )
Find root objects excluding production and temporary objects
handle_graph_findRootObjects( conn=connection, container_pattern="%WBC%,%StGeo%", exclude_objects="PRD_%,%.temp_%,%.bak_%" )
Quick summary of root objects
handle_graph_findRootObjects( conn=connection, container_pattern="DEV01_StGeo_STD_T", return_format="summary" )
Technical Implementation:
Queries the edge repository to find all objects in specified containers
Identifies objects that appear as sources but never as targets
These are "root" objects - they have no upstream dependencies
Results are filtered by exclude_objects and object_types parameters
Returns list of root objects suitable for downstream impact analysis
| Name | Required | Description | Default |
|---|---|---|---|
| object_types | No | ||
| return_format | No | detailed | |
| edge_repository | No | ||
| exclude_objects | No | ||
| container_pattern | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds meaningful algorithmic context: it 'queries the edge repository,' identifies 'objects that appear as sources but never as targets,' and applies exclude/object-type filters before returning results. It does not disclose potential performance costs or return-size limits, but the read-only and idempotent annotations lower the burden 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?
The description is long but well-organized with clear sections: overview, use cases, parameter details, examples, and technical implementation. The repeated emphasis on the string-type container_pattern is justified by the likely array-passing mistake, though some 'Technical Implementation' points restate earlier 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?
The description is thorough for a 5-parameter tool with no output schema: it defines every parameter, gives positive and negative examples, and describes return format options. It is not fully complete because of the edge_repository requirement contradiction and the extraneous conn argument in examples, which could mislead an agent despite the otherwise rich guidance.
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 extensively: it documents wildcards, CSV formatting, string-vs-array pitfalls, whitespace trimming, defaults, and examples for every parameter. However, it says edge_repository is a 'Required parameter — no default,' while the schema marks it optional with a default of ''; the example calls also include a 'conn=connection' argument that is not in the schema and would violate additionalProperties:false.
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: 'Find root objects (objects with no upstream dependencies) in specified containers.' It then explains what root objects are and why they matter, which clearly differentiates this from lineage-tracing and graph-analysis siblings like graph_traceLineage and graph_bfsLevels.
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 'Use this for' section gives explicit scenarios such as 'Finding starting points for downstream impact analysis' and 'Identifying source tables and base objects in data pipelines.' It does not name alternative sibling tools or provide negative guidance ('do not use when...'), so it stops short of full when-to-use-versus-alternatives clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_traceLineageGraph TracelineageARead-onlyIdempotent
Analyse object dependencies in Teradata. Supports wildcards (%) and CSV patterns.
Hybrid implementation — no stored procedure required. Python constructs Teradata recursive CTEs that execute entirely server-side. Only the reachable subgraph crosses the network — not the full edge table.
Examples: 'DB.Table' (single), '%WBC%.%' (wildcard), 'DB.T1,DB.T2' (CSV)
Finds upstream dependencies (what the object depends on) and downstream dependents (what depends on the object). Returns nodes and edges representing the dependency subgraph.
When multiple patterns are provided via CSV, one upstream CTE and one downstream CTE is executed per pattern. Results are merged and deduplicated by Python before assembly.
Use this for:
Impact analysis: "What breaks if I change or drop this object?"
Lineage tracing: "Where does this data come from?"
Dependency discovery: "What does this object use?"
Pre-deployment validation: checking impacts before making changes
Arguments: object_name - str: Object name pattern(s). Supports wildcards (%) and CSV format. STRING type — not an array.
Single: 'DEV01_StGeo_STD_T.mortgage_account'
Wildcard: '%WBC%.%'
Multiple: '%WBC%.%,%StGeo%.%'max_depth_up - int: Maximum levels to traverse upstream (0-10). 0 = no upstream analysis. Default: 3
max_depth_down - int: Maximum levels to traverse downstream (0-10). 0 = no downstream analysis. Default: 3
exclude_objects - str: CSV LIKE patterns to exclude. Matches against DB.Object format. Example: 'PRD_%,%.temp_%' Default: '' (no exclusions)
include_containers - str: CSV of container LIKE patterns to include (whitelist). Empty = all containers. Default: '' (all containers)
edge_repository - str: Edge repository view/table conforming to the Required parameter — no default.
return_format - str: 'detailed' (default), 'summary', or 'edges_only'
Returns: ResponseType: formatted response with dependency analysis results.
detailed response structure: { "nodes": [...], // Unique nodes (deduplicated) "upstream_edges": [...], // One row per upstream edge "downstream_edges":[...], // One row per downstream edge "summary": {...} // Aggregate statistics }
Edge row fields: DependentObjectDBName, DependentObjectName, FQDependentObjectName, ReferencedObjectDBName, ReferencedObjectName, FQReferencedObjectName, Src_Kind, Tgt_Kind, Depth, DependencyPath
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | Yes | ||
| max_depth_up | No | ||
| return_format | No | detailed | |
| max_depth_down | No | ||
| edge_repository | No | ||
| exclude_objects | No | ||
| include_containers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses the hybrid implementation, the fact that Python constructs server-side recursive CTEs, that only reachable subgraphs cross the network, and that results are deduplicated and merged. It also explains per-pattern CTE execution, giving a strong behavioral model.
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 long but well-structured with clear sections: overview, implementation notes, examples, use cases, arguments, and return structure. Given the tool's seven parameters and zero schema coverage, every section earns its place and the front-loaded purpose and examples aid quick understanding.
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 provides a detailed return structure including nodes, upstream/downstream edges, summary fields, and edge row field names. Combined with exhaustive argument documentation, an agent has everything needed to select, invoke, and interpret results without opening schemas.
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 documenting all seven parameters with types, defaults, ranges, and examples. It also clarifies that object_name is a STRING, not an array, and explicitly warns that edge_repository is required despite the schema default, which is valuable semantic 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?
The description opens with 'Analyse object dependencies in Teradata', naming a specific verb, resource, and system. It further clarifies that it finds both upstream dependencies and downstream dependents, and provides concrete pattern examples, making it easy to distinguish from sibling graph 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 includes a dedicated 'Use this for' section with concrete scenarios such as impact analysis, lineage tracing, and pre-deployment validation. It does not explicitly name alternative sibling tools or say when not to use this tool, 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.
plot_line_chartPlot Line ChartARead-onlyIdempotent
Generate a line chart that reads directly from a Teradata table — do NOT use base_readQuery to pre-fetch data first. Specify the table in table_name, the x-axis column in labels (typically a date or time field), and one or more y-axis numeric columns in columns. Use for time-series, trend lines, or sequential data. Do NOT use for proportional category breakdowns — use plot_pie_chart or plot_polar_chart. Do NOT use for multi-dimensional spider comparisons — use plot_radar_chart.
PARAMETERS: table_name: Required Argument. Specifies the name of the table to generate the line chart. Types: str
labels:
Required Argument.
Specifies the x-axis column (typically date or time).
Types: str
columns:
Required Argument.
Specifies the y-axis numeric column(s) for the line chart.
Types: List[str]RETURNS: dict
| Name | Required | Description | Default |
|---|---|---|---|
| labels | Yes | Required Argument. Specifies the x-axis column (typically date or time). Types: str | |
| columns | Yes | Required Argument. Specifies the y-axis numeric column(s) for the line chart. Types: List[str] | |
| table_name | Yes | Required Argument. Specifies the name of the table to generate the line chart. Types: str |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description doesn't need to repeat those. It adds useful behavioral context by stating 'reads directly from a Teradata table — do NOT use base_readQuery to pre-fetch data first', which clarifies the data-access pattern and implies an efficient read operation. It also mentions the return type (dict) which is not in the schema. This enriches the behavioral picture without contradicting 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 a single paragraph that is front-loaded with the core purpose, immediately followed by essential usage directives. Every sentence serves a distinct function: statement of action, explicit anti-pattern, parameter specification, and grouped alternatives. There is no repetition or filler. The length is appropriate for the amount of guidance provided.
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 that the tool is a simple charting operation with no output schema and only three straightforward parameters, the description covers everything an agent needs to select and invoke it correctly: purpose, parameter roles, usage conditions, and alternatives. The annotations cover safety, and the return type is stated. No crucial information is missing for correct execution.
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 100% (each parameter has its own description), so the baseline is 3. The description adds semantic value beyond the schema: it specifies that `labels` is 'typically a date or time field' and that `columns` accepts 'one or more y-axis numeric columns'. This clarifies the expected column types and cardinality, which helps the agent select appropriate values. The description also ties the parameters to the chart's purpose, enriching the structured schema data.
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: 'Generate a line chart that reads directly from a Teradata table'. It clearly distinguishes the tool from siblings by explicitly stating what it is not for (proportional breakdowns, spider comparisons) and naming the alternatives. This leaves no ambiguity about the tool's primary function.
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 for time-series, trend lines, or sequential data') and explicit when-not-to-use guidance with named alternatives ('Do NOT use for proportional category breakdowns — use plot_pie_chart or plot_polar_chart... Do NOT use for multi-dimensional spider comparisons — use plot_radar_chart'). It also instructs against using a sibling tool (base_readQuery) for pre-fetching, which is a clear usage directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_pie_chartPlot Pie ChartARead-onlyIdempotent
Generate a pie chart that reads directly from a Teradata table — do NOT use base_readQuery to pre-fetch or aggregate data first. Specify the table in table_name, the category column in labels, and the numeric value column in column. Use when the user asks for proportions, shares, or how a total breaks down by category. For polar area charts, use plot_polar_chart. For time-series trends, use plot_line_chart.
PARAMETERS: table_name: Required Argument. Specifies the name of the table to generate the pie chart. Types: str
labels:
Required Argument.
Specifies the category column for labels.
Types: str
column:
Required Argument.
Specifies the numeric value column for the pie chart.
Types: strRETURNS: dict
| Name | Required | Description | Default |
|---|---|---|---|
| column | Yes | Required Argument. Specifies the numeric value column for the pie chart. Types: str | |
| labels | Yes | Required Argument. Specifies the category column for labels. Types: str | |
| table_name | Yes | Required Argument. Specifies the name of the table to generate the pie chart. Types: str |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds behavior beyond this: it reads directly from a Teradata table and must not be preceded by a base_readQuery fetch. It does not describe the return structure in detail, but the annotations cover the safety profile and the description adds meaningful operational 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?
Every sentence earns its place. The key instruction to avoid base_readQuery is front-loaded, parameter mapping is compact, and sibling alternatives are named in a single sentence. There is no verbose or redundant 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 three-parameter chart tool with read-only annotationshol, the description fully covers what an agent needs: when to use it, how to map arguments, and which alternatives exist. The lack of a detailed output schema is not a material gap for a simple chart-plotting tool whose return is declared as a dict.
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 100%, so the schema already documents all three parameters. However, the description adds semantic roles: table_name is the source table, labels is the categorical column, and column is the numeric value column. This clarifies how the parameters relate to the pie chart's construction beyond the generic schema text.
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 action (generate a pie chart), the data source (Teradata table), and the exact parameter roles. It also differentiates from sibling tools by explicitly naming plot_polar_chart and plot_line_chart as alternatives for different chart types.
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 explicitly says when to use this tool ('proportions, shares, or how a total breaks down by category') and when not to, including both the prohibition against base_readQuery and pointers to alternative chart tools. This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_polar_chartPlot Polar ChartARead-onlyIdempotent
Generate a polar area chart that reads directly from a Teradata table — do NOT use base_readQuery first. Specify the table in table_name, the category column in labels, and the numeric value column in column. Use when the user explicitly asks for a polar chart or polar area chart. For standard pie-style breakdowns, use plot_pie_chart instead.
PARAMETERS: table_name: Required Argument. Specifies the name of the table to generate the polar chart. Types: str
labels:
Required Argument.
Specifies the category column for labels.
Types: str
column:
Required Argument.
Specifies the numeric value column for the polar chart.
Types: strRETURNS: dict
| Name | Required | Description | Default |
|---|---|---|---|
| column | Yes | Required Argument. Specifies the numeric value column for the polar chart. Types: str | |
| labels | Yes | Required Argument. Specifies the category column for labels. Types: str | |
| table_name | Yes | Required Argument. Specifies the name of the table to generate the polar chart. Types: str |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context by stating the tool reads directly from a Teradata table and must not be preceded by base_readQuery, which is a non-obvious integration detail 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?
The description is compact and front-loaded: it states the action, the critical negative instruction, the parameter mapping, the intended trigger context, and the sibling alternative in a few sentences. Every sentence earns its place with no filler or repetition.
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 chart tool with three required string parameters, read-only annotations, and no output schema, the description covers what the tool does, how to call it, when to use it, and what not to call first. Nothing essential 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?
Schema description coverage is 100%, so the schema already documents all three parameters. The description restates the mapping from table_name, labels, and column to their roles, but adds no additional syntax or format details beyond what the schema provides. Baseline 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?
The description opens with a specific verb and resource: "Generate a polar area chart that reads directly from a Teradata table." It clearly distinguishes itself from plot_pie_chart and explicitly warns against using base_readQuery first, so an agent can identify the correct tool 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?
The description gives explicit when-to-use guidance: "Use when the user explicitly asks for a polar chart or polar area chart." It also names an alternative for a different case: "For standard pie-style breakdowns, use plot_pie_chart instead," and states the do-not-do action of avoiding base_readQuery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plot_radar_chartPlot Radar ChartARead-onlyIdempotent
Generate a radar chart (spider chart or web chart) that reads directly from a Teradata table — do NOT use base_readQuery to pre-fetch data first. Specify the table in table_name, the category column in labels, and one or more value columns in columns. Use when the user asks for a spider chart, radar chart, web chart, or multi-dimensional comparison across categories. For time-series or trend data, use plot_line_chart instead.
PARAMETERS: table_name: Required Argument. Specifies the name of the table to generate the radar chart. Types: str
labels:
Required Argument.
Specifies the category column for labels.
Types: str
columns:
Required Argument.
Specifies the value column(s) for the radar chart.
Types: str | List[str]RETURNS: dict
| Name | Required | Description | Default |
|---|---|---|---|
| labels | Yes | Required Argument. Specifies the category column for labels. Types: str | |
| columns | Yes | Required Argument. Specifies the value column(s) for the radar chart. Types: str | List[str] | |
| table_name | Yes | Required Argument. Specifies the name of the table to generate the radar chart. Types: str |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds a meaningful behavioral constraint: it reads directly from a Teradata table and explicitly warns 'do NOT use base_readQuery to pre-fetch data first.' This goes beyond the annotations and helps the agent avoid an incorrect invocation pattern.
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, immediately followed by the critical integration constraint and the usage guideline. Every sentence adds operational value; there is no filler or repetition of schema details beyond what is 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?
The tool is simple with three documented parameters and safe read-only annotations. The description covers when to use it, what it reads, and how to invoke it, and it states the return type as dict. Nothing essential is missing for an agent 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 100%, so the schema already documents all three parameters. The description restates the mapping ('table_name, labels, columns') and adds that columns can be one or more value columns, but this adds little meaning beyond what the anyOf schema type already conveys. Baseline 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 plus resource: 'Generate a radar chart... that reads directly from a Teradata table.' It also names synonyms (spider/web chart) and clearly distinguishes it from plot_line_chart and other plotting siblings. An agent can tell exactly 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?
Provides explicit selection criteria: 'Use when the user asks for a spider chart, radar chart, web chart, or multi-dimensional comparison across categories.' It also names the alternative for time-series or trend data (plot_line_chart), giving a clear when-to-use versus when-not-to-use distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_columnSummaryQlty ColumnsummaryARead-onlyIdempotent
Get summary statistics for ALL columns in a table in a single call. Use when the user asks for an overview, profile, or summary of every field in a table. For detailed statistics on a SINGLE specific column (min, max, percentiles), use qlty_univariateStatistics instead.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds the key behavioral detail that it returns summary statistics for ALL columns in a single call, and explains the persist parameter's effect (materializes as a volatile table and returns table name). This adds 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?
The description is compact and front-loaded: the core purpose and scope are stated in the first sentence, followed by usage guidance and a brief parameter list. Every sentence earns its place, and the parameter list is a useful quick reference without being verbose.
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 summary tool with 100% schema coverage and no output schema, the description is largely complete. It explains the tool's scope, when to use it, and the persist behavior. The only minor gap is that it doesn't describe the exact structure of the returned summary statistics, but since there is no output schema and the tool is read-only, this is a minor omission.
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 100%, so the schema already documents all three parameters. The description repeats the parameter names and brief meanings but doesn't add much beyond the schema. The persist behavior is already in the schema description, so the description adds minimal extra semantic 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?
The description states a specific verb ('Get summary statistics') and resource ('ALL columns in a table in a single call'), and explicitly distinguishes it from the sibling qlty_univariateStatistics for single-column detailed stats. This makes the tool's purpose immediately clear and differentiates it from similar 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 explicitly says when to use this tool ('when the user asks for an overview, profile, or summary of every field in a table') and names the alternative for single-column statistics (qlty_univariateStatistics). This gives clear usage guidance and exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_distinctCategoriesQlty DistinctcategoriesARead-onlyIdempotent
Get the unique (distinct) values present in a specific column of a table. Use when the user asks what unique values, categories, or entries exist in a named column. Requires both a table name and a column name — if no column name is specified, ask for clarification before calling.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze column_name - Column name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| column_name | Yes | Column name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, lowering the burden. The description adds valuable behavior beyond that by explaining the persist flag: 'If True, materializes result as a volatile table and returns table name.' This clarifies a side-effect-like optional behavior without contradicting the read-only 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 opening purpose and usage guidance are concise and front-loaded, but the Arguments section duplicates the input schema verbatim for all four parameters. Since the schema already covers those definitions, that repetition reduces the efficiency of the description.
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 key invocation details: operation, relevant user requests, required vs optional parameters, and the persist branch that returns a table name. With no output schema, it could more explicitly describe the default return format when persist is false, but the first sentence and title make the intended result clear enough.
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 100%, so the baseline is 3. The description's Arguments section largely repeats the schema's parameter descriptions and adds no new semantic detail beyond noting that database_name is optional and column_name is required, which is already reflected in the schema's required list.
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 'Get the unique (distinct) values present in a specific column of a table,' which states a clear verb, resource, and scope. It also differentiates the tool from siblings by tying it to user requests for 'unique values, categories, or entries' in a named column.
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 says 'Use when the user asks what unique values, categories, or entries exist in a named column' and clarifies that both table_name and column_name are required, telling the agent to ask for clarification if column_name is missing. It does not name alternative sibling tools, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_missingValuesQlty MissingvaluesARead-onlyIdempotent
List the column names that contain NULL or missing values in a table. Returns a column-level summary showing WHICH columns have missing data. Use when the user asks which columns have nulls, which fields have missing data, or how many nulls exist per column. Do NOT use to retrieve the actual data rows — use qlty_rowsWithMissingValues to get the specific records where a column is null.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds useful context about the optional persist behavior materializing a volatile table and returning a table name. The description does not contradict annotations, and while it could describe the exact output format more fully, it adequately reveals scope and 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?
The description is well-structured and front-loaded: a clear purpose statement, explicit use conditions, and a brief argument list. The argument list duplicates the schema somewhat, which costs a little, but the overall length is still reasonable and every major clause contributes.
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 analysis tool, the description covers what it returns, when to use it, when not to use it, and optional persistence behavior. No output schema exists, but the column-level summary and the mention of null counts per column give sufficient expectation; more detail about the exact return structure would be nice but is not critical.
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 100%, with each parameter already documented in the input schema. The description repeats the parameter meanings without adding material detail beyond what the schema provides, so it meets the baseline but does not elevate comprehension further.
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 tool lists column names containing NULL/missing values in a table and returns a column-level summary. This immediately distinguishes it from related qlty tools that handle negative values, row-level missing data, or statistical summaries.
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 explicitly says to use this tool when the user asks which columns have nulls or how many nulls exist per column, and explicitly warns against using it to retrieve data rows, directing the agent to qlty_rowsWithMissingValues instead. This is strong routing guidance with a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_negativeValuesQlty NegativevaluesARead-onlyIdempotent
Identify which numeric columns in a table contain negative values. Use when the user asks about negative numbers, values below zero, or columns with anomalous negative entries. Returns the list of affected column names.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavioral context by noting that it returns the list of affected column names, and clarifies the persist option materializes a volatile table. This is meaningful 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?
The description is concise, front-loaded with the main purpose, and then lists parameters. The second sentence could be considered slightly repetitive with the schema, but overall it's compact and well-organized.
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 analysis tool with full schema coverage and no output schema, the description is fairly complete. It states what it returns (list of affected column names) and when to use it. It doesn't mention edge cases like tables with no numeric columns, but that's 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?
Schema description coverage is 100%, so the schema already documents all three parameters. The description repeats the parameter names and brief hints but adds little beyond what the schema provides. Baseline 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?
The description clearly identifies what the tool does: it identifies which numeric columns in a table contain negative values. It distinguishes itself from siblings like qlty_missingValues and qlty_distinctCategories by focusing specifically on negative values, and it even includes usage examples ('negative numbers, values below zero'). This is a specific verb+resource combination.
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 explicitly states when to use this tool: 'Use when the user asks about negative numbers, values below zero, or columns with anomalous negative entries.' Although it doesn't name sibling alternatives, among the qlty_* siblings this is clearly the negative-value-specific one. It gives clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_rowsWithMissingValuesQlty RowswithmissingvaluesARead-onlyIdempotent
Retrieve the actual data rows where a specific column is NULL or missing. Returns the records themselves, not a column summary. Use when the user wants to SEE or FETCH the rows with missing values in a named column. Do NOT write a SQL query with base_readQuery for this — always use this tool when the request is about rows with null values. Do NOT use for a column-level summary of which columns have nulls — use qlty_missingValues for that.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze column_name - Column name to analyze for missing values persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| column_name | Yes | Column name to analyze for missing values | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it returns raw records rather than a summary, and it documents that persist=True materializes a volatile table and returns the table name. Minor details like row limits or pagination are not disclosed, but this is acceptable for a read-only fetch.
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 guidance is well front-loaded and the do/don't usage sentences are efficient. However, the 'Arguments:' section essentially repeats the schema's parameter descriptions, which adds unnecessary length without earning its place. Overall, the description is helpful but not maximally 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 tool with only two required parameters and clear sibling differentiation, the description conveys the essential return behavior ('returns the records themselves') and the optional persist side effect. Even without an output schema, an agent has enough information to call the tool and interpret the result; pagination details would be a nice addition but are not critical here.
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 100%, and the argument list in the description mirrors the schema descriptions nearly verbatim. Therefore, the description adds no additional semantic meaning beyond what the input schema already provides, so the baseline score of 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?
The description opens with a specific action: 'Retrieve the actual data rows where a specific column is NULL or missing.' It explicitly distinguishes itself from a column summary and even names the sibling tool qlty_missingValues, making its 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 clearly states when to use this tool ('when the user wants to SEE or FETCH the rows'), provides a hard exclusion ('Do NOT write a SQL query with base_readQuery... always use this tool'), and routes column-level summaries to qlty_missingValues. This gives an agent complete decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_standardDeviationQlty StandarddeviationARead-onlyIdempotent
Calculate the mean (average) and standard deviation for a single numeric column. Use when the user asks specifically for standard deviation, the spread of values, or just mean and variability. For a fuller statistical profile including min, max, quartiles, and percentiles, use qlty_univariateStatistics instead.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze column_name - Column name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| column_name | Yes | Column name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds useful behavioral context beyond this: the persist option materializes the result as a volatile table and returns the table name, and the operation is scoped to a single numeric column. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences of core guidance followed by a compact argument list. Purpose and usage guidance are front-loaded, and every sentence earns its place without 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 definition covers purpose, usage conditions, an alternative tool, all parameters, and the persist side-effect. The only gap is the lack of default return format (what is returned when persist is false), but given the low complexity and the presence of annotations, this is minor.
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 100%, so the baseline is 3. The description repeats the parameter list and their meanings without adding new semantics beyond what the schema already provides. It does clarify the effect of persist ('materializes result as a volatile table') which is already present in the schema, so no additional value is gained.
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 ('Calculate') and a clear resource ('mean and standard deviation for a single numeric column'). It also distinguishes itself from sibling tool qlty_univariateStatistics by explicitly naming it as the alternative for a fuller statistical profile, giving agents an immediate basis 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?
The description provides explicit when-to-use guidance: 'when the user asks specifically for standard deviation, the spread of values, or just mean and variability'. It also names an alternative tool for other cases, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qlty_univariateStatisticsQlty UnivariatestatisticsARead-onlyIdempotent
Calculate full univariate statistics for a single numeric column including min, max, mean, standard deviation, quartiles, and percentiles. Use when the user asks for a complete or comprehensive statistical breakdown of one specific column. For just mean and standard deviation, use qlty_standardDeviation. For statistics across ALL columns in a table at once, use qlty_columnSummary.
Arguments: database_name - Name of the database (optional) table_name - Table name to analyze column_name - Column name to analyze persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| table_name | Yes | Table name to analyze | |
| column_name | Yes | Column name to analyze | |
| database_name | No | Name of the database (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds useful context about the persist option materializing a volatile table and returning a table name. The only minor omission is the return behavior for the ordinary non-persist case, but this is not severe given the annotation coverage.
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-loads the core purpose before alternatives. It includes a mini parameter list, which is slightly redundant with the schema, but the text is dense and every part adds usable 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?
The tool lacks an output schema, so the description should clarify what the agent can expect when persist is false. It only mentions the returned table name when persist is true, leaving the normal result shape implicit. Otherwise, all key usage and routing information 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 100%, so the schema already explains all four parameters. The description repeats the same parameter descriptions without adding deeper semantics, such as formatting expectations or constraints on numeric columns, so it stays at the baseline for fully covered schemas.
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 action, 'Calculate full univariate statistics for a single numeric column', and enumerates the outputs (min, max, mean, standard deviation, quartiles, percentiles). It also explicitly differentiates itself from qlty_standardDeviation and qlty_columnSummary, making its scope immediately 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?
It gives a direct 'Use when' condition: when the user asks for a complete or comprehensive statistical breakdown of one specific column. It also names concrete alternatives with their selection criteria, such as using qlty_standardDeviation for just mean/std and qlty_columnSummary for all columns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rag_Execute_WorkflowRag Execute WorkflowBRead-onlyIdempotent
Execute complete RAG workflow to answer user questions based on document context. This tool handles the entire RAG pipeline in a single step when a user query is tagged with /rag.
WORKFLOW STEPS (executed automatically):
Configuration setup using configurable values from rag_config.yml
Store user query with '/rag ' prefix stripping
Generate query embeddings using either BYOM (ONNXEmbeddings) or IVSM functions based on config
Perform semantic search against precomputed chunk embeddings
Return context chunks for answer generation
CONFIGURATION VALUES (from rag_config.yml):
version: 'ivsm' or 'byom' to select embedding approach
All database names, table names, and model settings are configurable
Vector store metadata fields are dynamically detected
Embedding parameters are configurable
Default chunk retrieval count is configurable
Default values are provided as fallback
TECHNICAL DETAILS:
Strips the '/rag ' prefix if present from user questions
Creates query table if it does not exist (columns: id, txt, created_ts)
BYOM approach: Uses mldb.ONNXEmbeddings UDF for tokenization and embedding
IVSM approach: Uses ivsm.tokenizer_encode and ivsm.IVSM_score functions
Both approaches store embeddings in configured output table
Uses cosine similarity via TD_VECTORDISTANCE for semantic search
Returns the top-k matching chunks from the configured vector store
Each result includes chunk text, similarity score, and metadata fields
CRITICAL ANSWERING RULES:
Answer ONLY using retrieved chunks - no external knowledge, speculation, or inference
Quote source content directly without paraphrasing, summarizing, or rewriting
If no relevant context found: "Not enough information found in the provided context"
If partial context: "The available context does not fully answer the question"
Include document/page references when available (e.g., "On page 2 of 'demo_policy.pdf'...")
Execute entire workflow silently without showing function calls to user - only show final answer
LANGUAGE RESTRICTIONS:
Do not say "According to the context" or "The context says" - just quote directly
Do not say "It can be inferred that..." - no inference allowed
Use exact or near-verbatim quotes only
No paraphrasing, summarizing, or adding transitions between quotes
Copy content precisely - no expansion or interpretation
BEHAVIORAL REQUIREMENTS:
Execute all RAG workflow steps silently without showing tool calls to users
Only display final answers based strictly on retrieved context chunks
Do not use external knowledge or speculation - only quote retrieved content directly
RAG mode only triggers with explicit /rag prefix - do not enter RAG mode implicitly
Hide all tool execution steps from user
Provide clean, direct response with only the answer based on retrieved chunks
This is a complete end-to-end RAG workflow - no additional tools needed
EXECUTION: Run completely silently - user only sees their question and the final context-grounded answer.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| question | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
On its own terms the description is remarkably transparent: it discloses prefix stripping, table creation, BYOM/IVSM embedding paths, TD_VECTORDISTANCE cosine similarity, top-k retrieval, and detailed answering and language constraints. However, it expressly discloses write behaviors - 'Creates query table if it does not exist' and 'Both approaches store embeddings in configured output table' - which directly contradict the annotation readOnlyHint=true. An agent relying on that annotation would expect zero environment modification and could be surprised (or fail) in a read-only environment where DDL is prohibited; per the contradiction rule this scores 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?
The description is well-structured with clear section headers and a front-loaded overview, and the answering rules mostly earn their space. But it is bloated with repetition: silent execution is stated roughly five times, no-paraphrasing/quote-directly about four times, and no-external-knowledge about three times across CRITICAL ANSWERING RULES, LANGUAGE RESTRICTIONS, BEHAVIORAL REQUIREMENTS, and EXECUTION. Roughly a third of the text is redundant reinforcement of the same constraints.
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 complex end-to-end pipeline with no output schema, coverage is strong: workflow steps, configuration sources, technical implementation details, result contents (chunk text, similarity score, metadata fields), fallback answer phrases, and document-reference format are all specified. Gaps remain around explicit return structure, error/failure behavior, and the un-annotated requirement for write privileges, but the operational contract an agent needs to answer correctly is substantially 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?
With 0% schema description coverage, the description must carry the parameter burden, and it partially does: question is clearly the user query, including the '/rag ' prefix-stripping behavior, and k maps to retrieval count via 'Returns the top-k matching chunks' with 'Default chunk retrieval count is configurable' as fallback. But neither parameter is ever explicitly mapped by name, and k's exact contract (overriding the configured default, null behavior) is left to inference.
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?
Opens with a specific verb-object pair ('Execute complete RAG workflow') plus a purpose ('answer user questions based on document context'), and immediately clarifies the scope: a single-step pipeline triggered by a /rag-tagged query. This differentiates it from sibling sql_Execute_Full_Pipeline, which handles the SQL pipeline instead. The tool's function is unmistakable even before reading the workflow details.
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 condition ('when a user query is tagged with /rag') and an explicit exclusion ('RAG mode only triggers with explicit /rag prefix - do not enter RAG mode implicitly'), plus 'no additional tools needed' to discourage tool chaining. However, it never names sibling alternatives for non-RAG query types (e.g., base_readQuery or sql_Execute_Full_Pipeline), so routing is implied by the /rag condition rather than explicitly contrasted with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sec_rolePermissionsSec RolepermissionsARead-onlyIdempotent
List the database-level permissions granted to a named Teradata role. Use when the user asks what access rights a ROLE has, what a role is allowed to do, or what permissions have been granted to a role. Do NOT confuse with user-level queries — use sec_userDbPermissions for a user's direct permissions or sec_userRoles for a user's role membership. Requires a role name.
Arguments: role_name - Role name to analyze. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| role_name | Yes | Role name to analyze. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, covering the safety profile. The description adds useful behavioral context beyond annotations: it mentions the requirement for a role name and explains the persist behavior, including that it materializes a volatile table and returns the table name. This is a meaningful disclosure of the non-default 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?
The description is well-structured: purpose first, then usage guidance, then differentiation, then a brief parameter list. It is slightly longer than necessary because the arguments section duplicates the schema, but every non-duplicated sentence adds value and the key information 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?
For a two-parameter read-only tool with no output schema, the description provides enough context to select and invoke it correctly. It explains role-level scope, differentiates from user-level siblings, and covers the persist output behavior. It does not describe the default return format, but the verb 'List' plus the read-only annotations make the expected behavior reasonably clear.
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 100%, so the schema already documents both role_name and persist. The description repeats the same parameter meanings without adding significant new syntax, formatting, or edge-case information. Baseline 3 is appropriate because the schema carries the semantic load.
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: 'List the database-level permissions granted to a named Teradata role.' It clearly distinguishes itself from sibling tools sec_userDbPermissions and sec_userRoles by explicitly naming them and the difference between role-level and user-level queries.
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 when-to-use guidance ('Use when the user asks what access rights a ROLE has...') and explicit when-not-to-use guidance with named alternatives ('Do NOT confuse with user-level queries — use sec_userDbPermissions... or sec_userRoles...'). An agent can route correctly without inferring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sec_userDbPermissionsSec UserdbpermissionsARead-onlyIdempotent
List the database-level access permissions (SELECT, INSERT, UPDATE, DELETE, etc.) granted directly to a specific Teradata user across all databases. Use when the user asks what a named user can DO in each database — their access rights, grants, or privileges on database objects. Do NOT use to see what roles a user has — use sec_userRoles for that. Requires a user name.
Arguments: user_name - User name to analyze. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| user_name | Yes | User name to analyze. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint and idempotentHint, and the description adds useful context by clarifying that only directly granted permissions are included. It also discloses the persist behavior: materializing to a volatile table and returning a table name. It does not detail the exact return fields, but the read-only annotation and list semantics reduce that 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?
The main purpose and usage guidance are front-loaded, and the description is compact enough for an agent to parse quickly. The argument list is somewhat redundant with the schema, but it is short and not distracting.
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 sufficient for this tool: it has simple parameters, full schema coverage, read-only/idempotent annotations, and no output schema. It covers scope, alternatives, and the persist behavior. It could be more explicit about the non-persist return format, but that is a minor gap given the clarity of the main action.
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 covers both parameters completely, each with a clear description. The description's argument section repeats the schema descriptions without adding extra meaning, defaults, validation details, or examples beyond what is already present.
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'), a clear resource ('database-level access permissions'), and a precise scope ('granted directly to a specific Teradata user across all databases'). It also distinguishes itself from sec_userRoles by explicitly noting that it is not for viewing roles.
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 provides explicit when-to-use guidance: 'Use when the user asks what a named user can DO in each database.' It also gives a direct exclusion and alternative: 'Do NOT use to see what roles a user has — use sec_userRoles for that.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sec_userRolesSec UserrolesARead-onlyIdempotent
List the roles currently assigned to a specific Teradata user account. Use when the user asks which roles a named user HAS, belongs to, or has been assigned. Do NOT use to see the permissions of those roles — use sec_rolePermissions for that. Do NOT use to see a user's direct database privileges — use sec_userDbPermissions for that. Requires a user name.
Arguments: user_name - User name to analyze. persist - If True, materializes result as a volatile table and returns table name
| Name | Required | Description | Default |
|---|---|---|---|
| persist | No | If True, materializes result as a volatile table and returns table name | |
| user_name | Yes | User name to analyze. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and idempotent hints, lowering the burden. The description adds the requirement of a user_name and discloses the persist side effect: materializing a volatile table and returning its name. It does not describe response format, but safety traits are well 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?
Compact and front-loaded: purpose, usage triggers, exclusions, and arguments are presented in a clear order with no filler. 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 read-only listing tool, the description covers required input, optional persist behavior, return behavior for persist, and sibling alternatives. No output schema exists, but the return concept is sufficiently implied 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 coverage is 100%, and the argument descriptions in the tool description are nearly identical to those in the input schema. The description adds no extra parameter-level meaning beyond what the schema already 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?
Description uses a specific verb ('List') and resource ('roles currently assigned to a specific Teradata user account'), and explicitly differentiates from sec_rolePermissions and sec_userDbPermissions. An agent can immediately identify 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?
Provides an explicit when-to-use trigger ('when the user asks which roles a named user HAS') and two explicit when-not-to-use exclusions with named alternatives. Selection guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_Analyze_Cluster_StatsSql Analyze Cluster StatsAIdempotent
ANALYZE SQL QUERY CLUSTER PERFORMANCE STATISTICS
This tool analyzes pre-computed cluster statistics to identify optimization opportunities without re-running the clustering pipeline. Perfect for iterative analysis and decision-making on which query clusters to focus optimization efforts.
ANALYSIS CAPABILITIES:
Performance Ranking: Sort clusters by any performance metric to identify top resource consumers
Resource Impact Assessment: Compare clusters by CPU usage, I/O volume, and execution complexity
Skew Problem Detection: Identify clusters with CPU or I/O distribution issues
Workload Characterization: Understand query patterns by user, application, and workload type
Optimization Prioritization: Focus on clusters with highest impact potential
AVAILABLE SORTING METRICS:
avg_cpu: Average CPU seconds per cluster (primary optimization target)
avg_io: Average logical I/O operations (scan intensity indicator)
avg_cpuskw: Average CPU skew (distribution problem indicator)
avg_ioskw: Average I/O skew (hot spot indicator)
avg_pji: Average Physical-to-Logical I/O ratio (compute intensity)
avg_uii: Average Unit I/O Intensity (I/O efficiency)
avg_numsteps: Average query plan complexity
queries: Number of queries in cluster (frequency indicator)
cluster_silhouette_score: Clustering quality measure
PERFORMANCE CATEGORIZATION: Automatically categorizes clusters using configurable thresholds (from sql_opt_config.yml):
HIGH_CPU_USAGE: Average CPU > config.performance_thresholds.cpu.high
HIGH_IO_USAGE: Average I/O > config.performance_thresholds.io.high
HIGH_CPU_SKEW: CPU skew > config.performance_thresholds.skew.high
HIGH_IO_SKEW: I/O skew > config.performance_thresholds.skew.high
NORMAL: Clusters within configured normal performance ranges
TYPICAL ANALYSIS WORKFLOW:
Sort by 'avg_cpu' or 'avg_io' to find highest resource consumers
Sort by 'avg_cpuskw' or 'avg_ioskw' to find distribution problems
Use limit_results to focus on top problematic clusters
OPTIMIZATION DECISION FRAMEWORK:
High CPU + High Query Count: Maximum impact optimization candidates
High Skew + Moderate CPU: Distribution/statistics problems
High I/O + Low PJI: Potential indexing opportunities
High NumSteps: Complex query rewriting candidates
OUTPUT FORMAT: Returns detailed cluster statistics with performance rankings, categories, and metadata for LLM analysis and optimization recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit_results | No | ||
| sort_by_metric | No | avg_cpu |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true but no read-only guarantee. The description adds useful behavioral context: it consumes pre-computed statistics, does not re-run clustering, applies thresholds from sql_opt_config.yml, and returns ranked/categorized results. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with clear sections, bullet lists, and front-loaded purpose. Some redundancy and a missing step in the workflow list slightly reduce polish, but the structure makes the content scannable and 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?
For a tool with no output schema, the description covers metrics, categorization, decision frameworks, and output format. It could be more explicit about exact return fields and preconditions, but an agent has enough information 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%, but the description compensates thoroughly by listing every valid sort_by_metric value with its meaning and giving limit_results a practical role in focusing on top clusters. This is far 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?
The description clearly states the tool 'analyzes pre-computed cluster statistics to identify optimization opportunities without re-running the clustering pipeline.' This specifies a distinct verb, resource, and scope, and differentiates it from pipeline-execution and query-retrieval 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?
It positions the tool as 'Perfect for iterative analysis and decision-making' and provides a typical workflow with sorting and limit_results. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_Execute_Full_PipelineSql Execute Full PipelineAIdempotent
COMPLETE SQL QUERY CLUSTERING PIPELINE FOR HIGH-USAGE QUERY OPTIMIZATION
This tool executes the entire SQL query clustering workflow to identify and analyze high CPU usage queries for optimization opportunities. It's designed for database performance analysts and DBAs who need to systematically identify query optimization candidates.
FULL PIPELINE WORKFLOW:
Query Log Extraction: Extracts SQL queries from DBC.DBQLSqlTbl with comprehensive performance metrics
Performance Metrics Calculation: Computes CPU skew, I/O skew, PJI (Physical to Logical I/O ratio), UII (Unit I/O Intensity)
Query Tokenization: Tokenizes SQL text using {sql_clustering_config.get('model', {}).get('model_id', 'bge-small-en-v1.5')} tokenizer via ivsm.tokenizer_encode
Embedding Generation: Creates semantic embeddings using ivsm.IVSM_score with ONNX models
Vector Store Creation: Converts embeddings to vector columns via ivsm.vector_to_columns
K-Means Clustering: Groups similar queries using TD_KMeans with optimal K from configuration
Silhouette Analysis: Calculates clustering quality scores using TD_Silhouette
Statistics Generation: Creates comprehensive cluster statistics with performance aggregations
PERFORMANCE METRICS EXPLAINED:
AMPCPUTIME: Total CPU seconds across all AMPs (primary optimization target)
CPUSKW/IOSKW: CPU/I/O skew ratios (>2.0 indicates distribution problems)
PJI: Physical-to-Logical I/O ratio (higher = more CPU-intensive)
UII: Unit I/O Intensity (higher = more I/O-intensive relative to CPU)
LogicalIO: Total logical I/O operations (indicates scan intensity)
NumSteps: Query plan complexity (higher = more complex plans)
CONFIGURATION (from sql_opt_config.yml):
Uses top {default_max_queries} queries by CPU time (configurable)
Creates {default_optimal_k} clusters by default (configurable via optimal_k parameter)
Embedding model: {sql_clustering_config.get('model', {}).get('model_id', 'bge-small-en-v1.5')}
Vector dimensions: {sql_clustering_config.get('embedding', {}).get('vector_length', 384)}
All database and table names are configurable
OPTIMIZATION WORKFLOW: After running this tool, use:
sql_Analyze_Cluster_Stats to identify problematic clusters
sql_Retrieve_Cluster_Queries to get actual SQL from target clusters
LLM analysis to identify patterns and propose specific optimizations
USE CASES:
Identify query families consuming the most system resources
Find queries with similar patterns but different performance
Discover optimization opportunities through clustering analysis
Prioritize DBA effort on highest-impact query improvements
Understand workload composition and resource distribution
PREREQUISITES:
DBC.DBQLSqlTbl and DBC.DBQLOgTbl must be accessible
Embedding models and tokenizers must be installed in feature_ext_db
Sufficient space in feature_ext_db for intermediate and final tables
| Name | Required | Description | Default |
|---|---|---|---|
| optimal_k | No | ||
| max_queries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as non-read-only and idempotent; the description adds that it 'extracts', 'creates', 'converts' tables, and requires 'sufficient space in feature_ext_db for intermediate and final tables.' It does not detail overwrite behavior, but the write side effects and prerequisites are disclosed 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?
The description is long but well-structured with bold sections, numbered workflow steps, metric definitions, use cases, and prerequisites. The purpose is front-loaded; while some use-case bullets restate the purpose, the organization makes the length acceptable for a complex pipeline.
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 covers the full pipeline, metrics, configuration, prerequisites, and downstream tools, which is substantial for a tool with no output schema and only two optional params. It does not specify exact output table names or return behavior, but an agent has enough to invoke and understand the side effects.
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 burden. It explains max_queries as 'top {default_max_queries} queries by CPU time (configurable)' and optimal_k as 'creates {default_optimal_k} clusters by default (configurable via optimal_k parameter)'. It doesn't give exact defaults or value ranges, but adds semantics the schema lacks.
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+resource: 'executes the entire SQL query clustering workflow to identify and analyze high CPU usage queries for optimization opportunities.' It clearly distinguishes this tool from downstream siblings by framing it as the full pipeline and listing sql_Analyze_Cluster_Stats and sql_Retrieve_Cluster_Queries as follow-up steps.
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 targets DBAs and performance analysts and gives a post-run workflow: 'After running this tool, use: 1. sql_Analyze_Cluster_Stats ... 2. sql_Retrieve_Cluster_Queries ...'. This gives clear context for when it precedes siblings, though it does not state explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sql_Retrieve_Cluster_QueriesSql Retrieve Cluster QueriesAIdempotent
RETRIEVE ACTUAL SQL QUERIES FROM SPECIFIC CLUSTERS FOR PATTERN ANALYSIS
This tool extracts the actual SQL query text and performance metrics from selected clusters, enabling detailed pattern analysis and specific optimization recommendations. Essential for moving from cluster-level analysis to actual query optimization.
DETAILED ANALYSIS CAPABILITIES:
SQL Pattern Recognition: Analyze actual query structures, joins, predicates, and functions
Performance Correlation: Connect query patterns to specific performance characteristics
Optimization Identification: Identify common anti-patterns, missing indexes, inefficient joins
Code Quality Assessment: Evaluate query construction, complexity, and best practices
Workload Understanding: See actual business logic and data access patterns
QUERY SELECTION STRATEGIES:
By CPU Impact: Sort by 'ampcputime' to focus on highest CPU consumers
By I/O Volume: Sort by 'logicalio' to find scan-intensive queries
By Skew Problems: Sort by 'cpuskw' or 'ioskw' for distribution issues
By Complexity: Sort by 'numsteps' for complex execution plans
By Response Time: Sort by 'response_secs' for user experience impact
AVAILABLE METRICS FOR SORTING:
ampcputime: Total CPU seconds (primary optimization target)
logicalio: Total logical I/O operations (scan indicator)
cpuskw: CPU skew ratio (distribution problems)
ioskw: I/O skew ratio (hot spot indicators)
pji: Physical-to-Logical I/O ratio (compute intensity)
uii: Unit I/O Intensity (I/O efficiency)
numsteps: Query execution plan steps (complexity)
response_secs: Wall-clock execution time (user impact)
delaytime: Time spent in queue (concurrency issues)
AUTOMATIC PERFORMANCE CATEGORIZATION: Each query is categorized using configurable thresholds (from sql_opt_config.yml):
CPU Categories: VERY_HIGH_CPU (>config.very_high), HIGH_CPU (>config.high), MEDIUM_CPU (>10s), LOW_CPU
CPU Skew: SEVERE_CPU_SKEW (>config.severe), HIGH_CPU_SKEW (>config.high), MODERATE_CPU_SKEW (>config.moderate), NORMAL
I/O Skew: SEVERE_IO_SKEW (>config.severe), HIGH_IO_SKEW (>config.high), MODERATE_IO_SKEW (>config.moderate), NORMAL
Use thresholds set in config file for, CPU - high, very_high, Skew moderate, high, severe
TYPICAL OPTIMIZATION WORKFLOW:
Start with clusters identified from sql_Analyze_Cluster_Stats
Retrieve top queries by impact metric (usually 'ampcputime')
Analyze SQL patterns for common issues:
Missing WHERE clauses or inefficient predicates
Cartesian products or missing JOIN conditions
Inefficient GROUP BY or ORDER BY operations
Suboptimal table access patterns
Missing or outdated statistics
Develop specific optimization recommendations
QUERY LIMIT STRATEGY:
Use the query limit set in config file for pattern recognition and analysis, unless user specifies a different limit
OUTPUT INCLUDES:
Complete SQL query text for each query
All performance metrics, user, application, and workload context, cluster membership and rankings
Performance categories for quick filtering
| Name | Required | Description | Default |
|---|---|---|---|
| metric | No | ampcputime | |
| cluster_ids | Yes | ||
| limit_per_cluster | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and readOnlyHint=false, but the description adds substantial behavioral detail: available sort metrics, automatic performance categorization with configurable thresholds, query selection strategies, and expected output contents. It does not contradict the annotations, and it goes far beyond what the structured fields reveal.
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 long but exceptionally well-structured with headers, bold terms, and bullet lists. The core purpose is front-loaded, and every section—metrics, categories, workflow, output—earns its place given the 0% schema coverage and absence of an output schema.
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 is remarkably complete. It explains what the output includes (SQL text, metrics, context, categories), how to sort queries, how categories are derived, and the recommended workflow. An agent has enough information to invoke it correctly and interpret 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%, so the description must compensate. It thoroughly explains the 'metric' parameter with a full list of options and their meanings, and it addresses 'limit_per_cluster' via the query limit strategy. The required 'cluster_ids' parameter is only indirectly explained through the workflow reference to clusters from sql_Analyze_Cluster_Stats, but the context is sufficient.
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 clear verb+resource statement: 'RETRIEVE ACTUAL SQL QUERIES FROM SPECIFIC CLUSTERS FOR PATTERN ANALYSIS'. It then details capabilities and explicitly references the sibling sql_Analyze_Cluster_Stats as the upstream step, making it easy to distinguish from cluster-level statistics 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 a 'TYPICAL OPTIMIZATION WORKFLOW' and explains when to use this tool: after cluster identification, to move from cluster-level analysis to query-level optimization. It also gives a query limit strategy and mentions sql_Analyze_Cluster_Stats as the source of clusters. However, it does not explicitly state when not to use this tool or name other alternatives.
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.
21 tool updates
v1.0.1- Changed
base_columnDescription2 fields changed- removed
Input schema / properties / obj_nameRemoved value: -{ - "default": "%", - "description": "Table or view name. Defaults to '%' (all tables).", - "type": "string" -} - added
Input schema / properties / table_nameAdded value: +{ + "default": "%", + "description": "Table or view name. Defaults to '%' (all tables).", + "type": "string" +}
- Changed
base_columnMetadata3 fields changed- added
Input schema / properties / database_nameAdded value: +{ + "type": "string" +} - removed
Input schema / properties / db_nameRemoved value: -{ - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "db_name" -]New value: +[ + "database_name" +]
- Changed
base_saveDDL3 fields changed- removed
Input schema / properties / object_nameRemoved value: -{ - "type": "string" -} - added
Input schema / properties / table_nameAdded value: +{ + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "object_name" -]New value: +[ + "database_name", + "table_name" +]
- Changed
base_tableDDL2 fields changed- removed
Input schema / properties / database_name / defaultRemoved value: -"" - changed
Input schema / requiredPrevious value: -[ - "table_name" -]New value: +[ + "table_name", + "database_name" +]
- Changed
base_tableList1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Database name. Leave empty for all databases."New value: +"Database name. Leave empty to list tables from all databases."
- Changed
dba_databaseSpace3 fields changed- removed
Input schema / properties / database_name / defaultRemoved value: -"" - changed
Input schema / properties / database_name / descriptionPrevious value: -"Database name. Leave empty or omit for all databases."New value: +"Database name. Required — do not pass empty string." - added
Input schema / requiredAdded value: +[ + "database_name" +]
- Changed
dba_sessionInfo1 field changed- changed
Input schema / properties / user_name / descriptionPrevious value: -"User name to analyze. User '*' to get all users."New value: +"User name to analyze. Use '*' to get all users."
- Changed
dba_tableSpace3 fields changed- removed
Input schema / properties / database_name / defaultRemoved value: -"" - changed
Input schema / properties / database_name / descriptionPrevious value: -"Database name filter. Leave empty for all databases."New value: +"Database name. Required — do not pass empty string." - added
Input schema / requiredAdded value: +[ + "database_name" +]
- Changed
dba_tableUsageImpact3 fields changed- removed
Input schema / properties / database_name / defaultRemoved value: -"" - changed
Input schema / properties / database_name / descriptionPrevious value: -"Database name to analyze. Leave empty for all databases."New value: +"Database name to analyze. Required — do not pass empty string." - added
Input schema / requiredAdded value: +[ + "database_name" +]
- Changed
dba_userSqlList3 fields changed- removed
Input schema / properties / user_name / defaultRemoved value: -"" - changed
Input schema / properties / user_name / descriptionPrevious value: -"User name filter. Leave empty or omit for all users."New value: +"User name to filter by. Required — do not pass empty string." - added
Input schema / requiredAdded value: +[ + "user_name" +]
- Changed
plot_line_chart3 fields changed- changed
Input schema / properties / columns / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: List[str]"New value: +"\nRequired Argument.\nSpecifies the y-axis numeric column(s) for the line chart.\nTypes: List[str]" - changed
Input schema / properties / labels / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the x-axis column (typically date or time).\nTypes: str" - changed
Input schema / properties / table_name / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the name of the table to generate the line chart.\nTypes: str"
- Changed
plot_pie_chart3 fields changed- changed
Input schema / properties / column / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the numeric value column for the pie chart.\nTypes: str" - changed
Input schema / properties / labels / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the category column for labels.\nTypes: str" - changed
Input schema / properties / table_name / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the name of the table to generate the pie chart.\nTypes: str"
- Changed
plot_polar_chart3 fields changed- changed
Input schema / properties / column / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the numeric value column for the polar chart.\nTypes: str" - changed
Input schema / properties / labels / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the category column for labels.\nTypes: str" - changed
Input schema / properties / table_name / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the name of the table to generate the polar chart.\nTypes: str"
- Changed
plot_radar_chart3 fields changed- changed
Input schema / properties / columns / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the value column(s) for the radar chart.\nTypes: str | List[str]" - changed
Input schema / properties / labels / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the category column for labels.\nTypes: str" - changed
Input schema / properties / table_name / descriptionPrevious value: -"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str"New value: +"\nRequired Argument.\nSpecifies the name of the table to generate the radar chart.\nTypes: str"
- Changed
qlty_columnSummary1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_distinctCategories1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_missingValues1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_negativeValues1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_rowsWithMissingValues1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_standardDeviation1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
- Changed
qlty_univariateStatistics1 field changed- changed
Input schema / properties / database_name / descriptionPrevious value: -"Name of the database (optional, omit if table_name is fully qualified)"New value: +"Name of the database (optional)"
1 tool update
v0.2.2- Changed
base_readQuery1 field changed- added
Input schema / properties / row_limitAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null +}
47 tool updates
v0.2.1- Changed
base_columnDescription11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"%" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name. Defaults to '%' (all databases)." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / obj_name / defaultAdded value: +"%" - added
Input schema / properties / obj_name / descriptionAdded value: +"Table or view name. Defaults to '%' (all tables)." - removed
Input schema / properties / obj_name / titleRemoved value: -"Obj Name" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "database_name", - "obj_name" -]
- Added
base_columnMetadata - Changed
base_databaseList3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / scopeAdded value: +{ + "default": "user", + "description": "Filter scope: 'user' returns only user-created databases (excludes system databases), 'all' returns every database.", + "type": "string" +}
- Changed
base_readQuery3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "type": "boolean" +} - removed
Input schema / properties / sql / titleRemoved value: -"Sql"
- Added
base_saveDDL - Changed
base_tableAffinity7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / database_name / descriptionAdded value: +"Database name" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - removed
Input schema / properties / obj_nameRemoved value: -{ - "title": "Obj Name", - "type": "string" -} - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_nameAdded value: +{ + "description": "Table or view name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "obj_name" -]New value: +[ + "database_name", + "table_name" +]
- Changed
base_tableDDL10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name" -]New value: +[ + "table_name" +]
- Changed
base_tableList7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / database_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name. Leave empty for all databases." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +}
- Changed
base_tablePreview9 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / database_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table or view name" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
base_tableUsage7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / database_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name. Leave empty for all databases." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +}
- Changed
dba_databaseSpace8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name. Leave empty or omit for all databases." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / requiredRemoved value: -[ - "database_name" -]
- Changed
dba_databaseVersion2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +}
- Changed
dba_featureUsage4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / end_date / titleRemoved value: -"End Date" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date"
- Changed
dba_flowControl4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / end_date / titleRemoved value: -"End Date" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date"
- Changed
dba_resusageSummary33 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / AppIDAdded value: +{ + "default": "", + "description": "Application ID to filter by. Leave empty for all applications.", + "type": "string" +} - removed
Input schema / properties / AppIdRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Appid" -} - added
Input schema / properties / LogDateAdded value: +{ + "default": "", + "description": "Log date to filter by in YYYY-MM-DD format. Leave empty for all dates.", + "type": "string" +} - removed
Input schema / properties / dateRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Date" -} - removed
Input schema / properties / dayOfWeek / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / dayOfWeek / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / dayOfWeek / descriptionAdded value: +"Day of week to filter by (1=Sunday, 2=Monday, ..., 7=Saturday). Leave empty for all days." - removed
Input schema / properties / dayOfWeek / titleRemoved value: -"Dayofweek" - added
Input schema / properties / dayOfWeek / typeAdded value: +"string" - removed
Input schema / properties / dimensionsRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Dimensions" -} - removed
Input schema / properties / hourOfDay / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / hourOfDay / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / hourOfDay / descriptionAdded value: +"Hour of day to filter by (0-23). Leave empty for all hours." - removed
Input schema / properties / hourOfDay / titleRemoved value: -"Hourofday" - added
Input schema / properties / hourOfDay / typeAdded value: +"string" - added
Input schema / properties / no_daysAdded value: +{ + "default": 7, + "description": "Number of days to look back from today (e.g., 7, 30, 90).", + "type": "integer" +} - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / user_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / user_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / user_name / descriptionAdded value: +"User name to filter by. Leave empty for all users." - removed
Input schema / properties / user_name / titleRemoved value: -"User Name" - added
Input schema / properties / user_name / typeAdded value: +"string" - removed
Input schema / properties / workloadComplexity / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / workloadComplexity / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / workloadComplexity / descriptionAdded value: +"Workload complexity to filter by (e.g., 'Simple', 'Medium', 'Complex'). Leave empty for all complexity levels." - removed
Input schema / properties / workloadComplexity / titleRemoved value: -"Workloadcomplexity" - added
Input schema / properties / workloadComplexity / typeAdded value: +"string" - removed
Input schema / properties / workloadType / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / workloadType / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / workloadType / descriptionAdded value: +"Workload type to filter by (e.g., 'Batch', 'Interactive'). Leave empty for all workload types." - removed
Input schema / properties / workloadType / titleRemoved value: -"Workloadtype" - added
Input schema / properties / workloadType / typeAdded value: +"string"
- Changed
dba_sessionInfo3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / user_name / titleRemoved value: -"User Name"
- Changed
dba_systemSpace2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +}
- Changed
dba_tableSpace14 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / database_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name filter. Leave empty for all databases." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / exclude_systemAdded value: +{ + "default": "N", + "description": "Exclude system databases and tables. Set to 'Y' to exclude, 'N' to include all (default: 'N').", + "type": "string" +} - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / table_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / table_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / table_name / descriptionAdded value: +"Table name filter. Leave empty for all tables." - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - added
Input schema / properties / table_name / typeAdded value: +"string" - added
Input schema / properties / top_nAdded value: +{ + "default": 0, + "description": "Limit results to top N largest tables by space. Set to 0 for no limit (default: 0).", + "type": "integer" +}
- Changed
dba_tableSqlList8 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / no_days / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - added
Input schema / properties / no_days / descriptionAdded value: +"Number of days to look back" - removed
Input schema / properties / no_days / titleRemoved value: -"No Days" - added
Input schema / properties / no_days / typeAdded value: +"integer" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to search for" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
dba_tableUsageImpact12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / database_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Database name to analyze. Leave empty for all databases." - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / user_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / user_name / defaultPrevious value: -nullNew value: +"" - added
Input schema / properties / user_name / descriptionAdded value: +"User name to analyze. Leave empty for all users." - removed
Input schema / properties / user_name / titleRemoved value: -"User Name" - added
Input schema / properties / user_name / typeAdded value: +"string"
- Changed
dba_userDelay4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / end_date / titleRemoved value: -"End Date" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date"
- Changed
dba_userSqlList10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / no_days / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -] - added
Input schema / properties / no_days / descriptionAdded value: +"Number of days to look back" - removed
Input schema / properties / no_days / titleRemoved value: -"No Days" - added
Input schema / properties / no_days / typeAdded value: +"integer" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / user_name / defaultAdded value: +"" - added
Input schema / properties / user_name / descriptionAdded value: +"User name filter. Leave empty or omit for all users." - removed
Input schema / properties / user_name / titleRemoved value: -"User Name" - removed
Input schema / requiredRemoved value: -[ - "user_name" -]
- Added
graph_analyseDatabase - Added
graph_bfsLevels - Added
graph_connectedComponents - Added
graph_detectCycles - Added
graph_edgeContractDDL - Added
graph_findRootObjects - Added
graph_traceLineage - Changed
plot_line_chart7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / columns / descriptionAdded value: +"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: List[str]" - removed
Input schema / properties / columns / titleRemoved value: -"Columns" - added
Input schema / properties / labels / descriptionAdded value: +"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str" - removed
Input schema / properties / labels / titleRemoved value: -"Labels" - added
Input schema / properties / table_name / descriptionAdded value: +"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
plot_pie_chart7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column / descriptionAdded value: +"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str" - removed
Input schema / properties / column / titleRemoved value: -"Column" - added
Input schema / properties / labels / descriptionAdded value: +"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str" - removed
Input schema / properties / labels / titleRemoved value: -"Labels" - added
Input schema / properties / table_name / descriptionAdded value: +"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
plot_polar_chart7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column / descriptionAdded value: +"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str" - removed
Input schema / properties / column / titleRemoved value: -"Column" - added
Input schema / properties / labels / descriptionAdded value: +"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str" - removed
Input schema / properties / labels / titleRemoved value: -"Labels" - added
Input schema / properties / table_name / descriptionAdded value: +"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
plot_radar_chart7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / columns / descriptionAdded value: +"\nRequired Argument.\nSpecifies the column to be used for generating the line plot.\nTypes: str" - removed
Input schema / properties / columns / titleRemoved value: -"Columns" - added
Input schema / properties / labels / descriptionAdded value: +"\nRequired Argument.\nSpecifies the labels to be used for the line plot.\nTypes: str" - removed
Input schema / properties / labels / titleRemoved value: -"Labels" - added
Input schema / properties / table_name / descriptionAdded value: +"\nRequired Argument.\nSpecifies the name of the table to generate the donut plot.\nTypes: str" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name"
- Changed
qlty_columnSummary10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name" -]New value: +[ + "table_name" +]
- Changed
qlty_distinctCategories12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column_name / descriptionAdded value: +"Column name to analyze" - removed
Input schema / properties / column_name / titleRemoved value: -"Column Name" - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "column_name" -]New value: +[ + "table_name", + "column_name" +]
- Changed
qlty_missingValues10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name" -]New value: +[ + "table_name" +]
- Changed
qlty_negativeValues10 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name" -]New value: +[ + "table_name" +]
- Changed
qlty_rowsWithMissingValues12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column_name / descriptionAdded value: +"Column name to analyze for missing values" - removed
Input schema / properties / column_name / titleRemoved value: -"Column Name" - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "column_name" -]New value: +[ + "table_name", + "column_name" +]
- Changed
qlty_standardDeviation12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column_name / descriptionAdded value: +"Column name to analyze" - removed
Input schema / properties / column_name / titleRemoved value: -"Column Name" - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "column_name" -]New value: +[ + "table_name", + "column_name" +]
- Changed
qlty_univariateStatistics12 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / column_name / descriptionAdded value: +"Column name to analyze" - removed
Input schema / properties / column_name / titleRemoved value: -"Column Name" - removed
Input schema / properties / database_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / database_name / defaultAdded value: +"" - added
Input schema / properties / database_name / descriptionAdded value: +"Name of the database (optional, omit if table_name is fully qualified)" - removed
Input schema / properties / database_name / titleRemoved value: -"Database Name" - added
Input schema / properties / database_name / typeAdded value: +"string" - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / table_name / descriptionAdded value: +"Table name to analyze" - removed
Input schema / properties / table_name / titleRemoved value: -"Table Name" - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "column_name" -]New value: +[ + "table_name", + "column_name" +]
- Changed
rag_Execute_Workflow3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / k / titleRemoved value: -"K" - removed
Input schema / properties / question / titleRemoved value: -"Question"
- Changed
sec_rolePermissions4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / role_name / descriptionAdded value: +"Role name to analyze." - removed
Input schema / properties / role_name / titleRemoved value: -"Role Name"
- Changed
sec_userDbPermissions4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / user_name / descriptionAdded value: +"User name to analyze." - removed
Input schema / properties / user_name / titleRemoved value: -"User Name"
- Changed
sec_userRoles4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / persistAdded value: +{ + "default": false, + "description": "If True, materializes result as a volatile table and returns table name", + "type": "boolean" +} - added
Input schema / properties / user_name / descriptionAdded value: +"User name to analyze." - removed
Input schema / properties / user_name / titleRemoved value: -"User Name"
- Changed
sql_Analyze_Cluster_Stats5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit_results / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / limit_results / titleRemoved value: -"Limit Results" - removed
Input schema / properties / limit_results / typeRemoved value: -"integer" - removed
Input schema / properties / sort_by_metric / titleRemoved value: -"Sort By Metric"
- Changed
sql_Execute_Full_Pipeline7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / max_queries / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / max_queries / titleRemoved value: -"Max Queries" - removed
Input schema / properties / max_queries / typeRemoved value: -"integer" - added
Input schema / properties / optimal_k / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - removed
Input schema / properties / optimal_k / titleRemoved value: -"Optimal K" - removed
Input schema / properties / optimal_k / typeRemoved value: -"integer"
- Changed
sql_Retrieve_Cluster_Queries4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / cluster_ids / titleRemoved value: -"Cluster Ids" - removed
Input schema / properties / limit_per_cluster / titleRemoved value: -"Limit Per Cluster" - removed
Input schema / properties / metric / titleRemoved value: -"Metric"
48 tool updates
v1.0.0- Removed
ba_databaseVersion - Changed
base_columnDescription3 fields changed- added
Input schema / properties / database_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / database_name / typeRemoved value: -"string" - removed
Input schema / titleRemoved value: -"handle_base_columnDescriptionArguments"
- Changed
base_databaseList1 field changed- removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Changed
base_readQuery1 field changed- removed
Input schema / titleRemoved value: -"handle_base_readQueryArguments"
- Changed
base_tableAffinity1 field changed- removed
Input schema / titleRemoved value: -"handle_base_tableAffinityArguments"
- Changed
base_tableDDL3 fields changed- added
Input schema / properties / database_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / database_name / typeRemoved value: -"string" - removed
Input schema / titleRemoved value: -"handle_base_tableDDLArguments"
- Changed
base_tableList5 fields changed- added
Input schema / properties / database_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / database_name / defaultAdded value: +null - removed
Input schema / properties / database_name / typeRemoved value: -"string" - removed
Input schema / requiredRemoved value: -[ - "database_name" -] - removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Changed
base_tablePreview1 field changed- removed
Input schema / titleRemoved value: -"handle_base_tablePreviewArguments"
- Changed
base_tableUsage1 field changed- removed
Input schema / titleRemoved value: -"handle_base_tableUsageArguments"
- Removed
cust_activeUsers - Removed
cust_td_serverInfo - Changed
dba_databaseSpace1 field changed- removed
Input schema / titleRemoved value: -"handle_dba_databaseSpaceArguments"
- Added
dba_databaseVersion - Changed
dba_featureUsage3 fields changed- added
Input schema / properties / end_date / descriptionAdded value: +"The end date for the query range in YYYY-MM-DD format." - added
Input schema / properties / start_date / descriptionAdded value: +"The start date for the query range in YYYY-MM-DD format." - removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Changed
dba_flowControl3 fields changed- added
Input schema / properties / end_date / descriptionAdded value: +"The end date for the query range in YYYY-MM-DD format." - added
Input schema / properties / start_date / descriptionAdded value: +"The start date for the query range in YYYY-MM-DD format." - removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Changed
dba_resusageSummary4 fields changed- added
Input schema / properties / AppIdAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Appid" +} - added
Input schema / properties / workloadComplexityAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Workloadcomplexity" +} - added
Input schema / properties / workloadTypeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Workloadtype" +} - removed
Input schema / titleRemoved value: -"handle_dba_resusageSummaryArguments"
- Changed
dba_sessionInfo4 fields changed- added
Input schema / properties / user_name / defaultAdded value: +"*" - added
Input schema / properties / user_name / descriptionAdded value: +"User name to analyze. User '*' to get all users." - removed
Input schema / requiredRemoved value: -[ - "user_name" -] - removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Added
dba_systemSpace - Changed
dba_tableSpace4 fields changed- added
Input schema / properties / database_name / defaultAdded value: +null - added
Input schema / properties / table_name / defaultAdded value: +null - removed
Input schema / requiredRemoved value: -[ - "database_name", - "table_name" -] - removed
Input schema / titleRemoved value: -"handle_dba_tableSpaceArguments"
- Changed
dba_tableSqlList1 field changed- removed
Input schema / titleRemoved value: -"handle_dba_tableSqlListArguments"
- Changed
dba_tableUsageImpact1 field changed- removed
Input schema / titleRemoved value: -"handle_dba_tableUsageImpactArguments"
- Changed
dba_userDelay3 fields changed- added
Input schema / properties / end_date / descriptionAdded value: +"The end date for the query range in YYYY-MM-DD format." - added
Input schema / properties / start_date / descriptionAdded value: +"The start date for the query range in YYYY-MM-DD format." - removed
Input schema / titleRemoved value: -"_dynamic_toolArguments"
- Changed
dba_userSqlList1 field changed- removed
Input schema / titleRemoved value: -"handle_dba_userSqlListArguments"
- Removed
get_cube_cust_cube_db_space_metrics - Removed
get_cube_sales_cube - Added
plot_line_chart - Added
plot_pie_chart - Added
plot_polar_chart - Added
plot_radar_chart - Changed
qlty_columnSummary1 field changed- removed
Input schema / titleRemoved value: -"handle_qlty_columnSummaryArguments"
- Changed
qlty_distinctCategories4 fields changed- removed
Input schema / properties / col_nameRemoved value: -{ - "title": "Col Name", - "type": "string" -} - added
Input schema / properties / column_nameAdded value: +{ + "title": "Column Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "col_name" -]New value: +[ + "database_name", + "table_name", + "column_name" +] - removed
Input schema / titleRemoved value: -"handle_qlty_distinctCategoriesArguments"
- Changed
qlty_missingValues1 field changed- removed
Input schema / titleRemoved value: -"handle_qlty_missingValuesArguments"
- Changed
qlty_negativeValues1 field changed- removed
Input schema / titleRemoved value: -"handle_qlty_negativeValuesArguments"
- Changed
qlty_rowsWithMissingValues4 fields changed- removed
Input schema / properties / col_nameRemoved value: -{ - "title": "Col Name", - "type": "string" -} - added
Input schema / properties / column_nameAdded value: +{ + "title": "Column Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "col_name" -]New value: +[ + "database_name", + "table_name", + "column_name" +] - removed
Input schema / titleRemoved value: -"handle_qlty_rowsWithMissingValuesArguments"
- Changed
qlty_standardDeviation4 fields changed- removed
Input schema / properties / col_nameRemoved value: -{ - "title": "Col Name", - "type": "string" -} - added
Input schema / properties / column_nameAdded value: +{ + "title": "Column Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "col_name" -]New value: +[ + "database_name", + "table_name", + "column_name" +] - removed
Input schema / titleRemoved value: -"handle_qlty_standardDeviationArguments"
- Changed
qlty_univariateStatistics4 fields changed- removed
Input schema / properties / col_nameRemoved value: -{ - "title": "Col Name", - "type": "string" -} - added
Input schema / properties / column_nameAdded value: +{ + "title": "Column Name", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "database_name", - "table_name", - "col_name" -]New value: +[ + "database_name", + "table_name", + "column_name" +] - removed
Input schema / titleRemoved value: -"handle_qlty_univariateStatisticsArguments"
- Added
rag_Execute_Workflow - Removed
rag_executeWorkflow - Removed
rag_executeWorkflow_ivsm - Removed
sales_customer_profile - Removed
sales_top_customers - Changed
sec_rolePermissions1 field changed- removed
Input schema / titleRemoved value: -"handle_sec_rolePermissionsArguments"
- Changed
sec_userDbPermissions1 field changed- removed
Input schema / titleRemoved value: -"handle_sec_userDbPermissionsArguments"
- Changed
sec_userRoles1 field changed- removed
Input schema / titleRemoved value: -"handle_sec_userRolesArguments"
- Added
sql_Analyze_Cluster_Stats - Added
sql_Execute_Full_Pipeline - Added
sql_Retrieve_Cluster_Queries - Removed
tmpl_nameOfTool
38 tool updates
- First observed
ba_databaseVersion - First observed
base_columnDescription - First observed
base_databaseList - First observed
base_readQuery - First observed
base_tableAffinity - First observed
base_tableDDL - First observed
base_tableList - First observed
base_tablePreview - First observed
base_tableUsage - First observed
cust_activeUsers - First observed
cust_td_serverInfo - First observed
dba_databaseSpace - First observed
dba_featureUsage - First observed
dba_flowControl - First observed
dba_resusageSummary - First observed
dba_sessionInfo - First observed
dba_tableSpace - First observed
dba_tableSqlList - First observed
dba_tableUsageImpact - First observed
dba_userDelay - First observed
dba_userSqlList - First observed
get_cube_cust_cube_db_space_metrics - First observed
get_cube_sales_cube - First observed
qlty_columnSummary - First observed
qlty_distinctCategories - First observed
qlty_missingValues - First observed
qlty_negativeValues - First observed
qlty_rowsWithMissingValues - First observed
qlty_standardDeviation - First observed
qlty_univariateStatistics - First observed
rag_executeWorkflow - First observed
rag_executeWorkflow_ivsm - First observed
sales_customer_profile - First observed
sales_top_customers - First observed
sec_rolePermissions - First observed
sec_userDbPermissions - First observed
sec_userRoles - First observed
tmpl_nameOfTool
TDQS
Scored across 47 tools
Most tools have clearly distinct purposes with explicit cross-references ('use X instead of Y'), making boundaries clear. Some overlap exists between base_tableUsage and dba_tableUsageImpact (both report table access/user activity), and the dense dba_* and qlty_* families could be confused at a glance, but the descriptions mitigate this well.
Prefix-based categories (base_, dba_, qlty_, graph_) provide useful structure, but case conventions are inconsistent: camelCase (base_readQuery), PascalCase (rag_Execute_Workflow, sql_Execute_Full_Pipeline), and snake_case (plot_polar_chart) are all mixed. Verb usage also varies, with some names lacking verbs entirely (base_columnDescription), though the names remain readable overall.
47 tools is well into 'tool sprawl' territory and exceeds the 25+ threshold for a heavy surface. The server bundles many distinct modules (RAG, SQL clustering, plotting, graph lineage, DBA, security, quality) into one MCP server, which makes scanning and selecting the right tool difficult. The count reflects breadth, but the scope is too large for a single coherent toolset.
For an analytics/observability-focused server, coverage is extensive: querying, metadata exploration, DBA monitoring, security permissions, data quality, lineage analysis, charting, and RAG workflows are all represented. The main gaps are write operations (no data modification, DDL execution, or user/role management), but these appear deliberately out of scope. Minor gaps like bulk export or scheduling are workable around.
Maintenance
Related MCP Connectors
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
The BigQuery remote MCP server is a fully managed service that uses the Model Context Protocol to connect AI applications and LLMs to BigQuery data sources. It provides secure, standardized tools for AI agents to list datasets and tables, retrieve schemas, generate and execute SQL queries through natural language, and analyze data—enabling direct access to enterprise analytics data without requiring manual SQL coding.
Marketing intelligence MCP server providing campaign performance data and analytics tools.
Draxlr's remote MCP server connects AI assistants to your SQL databases and dashboards. Explore schemas, run read-only queries, manage saved queries and dashboards, and export results, all with row-level security so each user sees only their own data.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server that turns Teradata Vantage into a full-stack analytics agent platform, providing AI agents with structured knowledge of Teradata's native functions for correct and optimal SQL analytics.11MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides comprehensive monitoring and management capabilities for Teradata Workload Management (WLM), enabling tasks like performance troubleshooting, emergency throttling, and scheduled maintenance through 41 tools and 39 resources.5Apache 2.0
- AlicenseCqualityDmaintenanceMCP server for Teradata databases, providing tools and prompts for querying, analyzing, and managing data through AI agents.38MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables querying SQL Server databases via tools for table search, SELECT execution, and table info retrieval.-