sql-mcp
Provides read-only access to PostgreSQL databases, allowing exploration of schemas, tables, views, stored procedures, indexes, foreign keys, and execution of SELECT queries.
Click on "Install 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., "@sql-mcpwhat tables are in the database?"
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.
sql-mcp
A read-only MCP (Model Context Protocol) server for relational databases. Gives Claude and other MCP clients the ability to explore and query databases — schemas, tables, views, stored procedures, indexes, foreign keys, and arbitrary SELECT queries.
Supported databases: SQL Server · PostgreSQL
Extensible: the provider factory lets you add any database engine with a single npm run scaffold command.
Table of contents
Related MCP server: SQL Query Tools MCP Server
Requirements
Node.js 22+
Access to a SQL Server instance (on-prem, Azure SQL, or SQL Server in Docker), or a PostgreSQL instance (v13+)
A dedicated read-only database login (see Read-only enforcement)
Installation
git clone https://github.com/teghoz/sql-mcp.git
cd sql-mcp
npm install
npm run buildConfiguration
Copy .env.example to .env and fill in your connection details.
cp .env.example .envProvider selection
Set DB_PROVIDER to choose the database engine. Defaults to mssql.
DB_PROVIDER=mssql # SQL Server (default)
DB_PROVIDER=postgres # PostgreSQLSQL Server configuration
Option A — Connection string
Provide a single ADO.NET connection string. When SQL_CONNECTION_STRING is set, all individual SQL_* parameters are ignored.
SQL_CONNECTION_STRING=Server=myserver,1433;Database=mydb;User Id=myuser;Password=secret;Encrypt=true;TrustServerCertificate=false;Common connection string keywords:
Keyword | Example | Notes |
|
| Hostname; append port with a comma |
|
| Default database |
|
| SQL Server login |
|
| |
|
| Use |
|
| Set |
|
| Seconds |
.NET app-config style keys
Connection strings copied straight out of a .NET app.config / web.config also work —
the server normalises the following keys before handing them to the driver, so no editing
is needed:
.NET key | Normalised to |
|
|
|
|
|
|
|
|
|
|
These keys are recognised by .NET but not by the underlying mssql driver, and are
stripped rather than silently ignored: Persist Security Info,
MultipleActiveResultSets, Application Name.
Option B — Individual parameters
SQL_SERVER=localhost
SQL_PORT=1433 # default: 1433
SQL_DATABASE=master # default database for queries
SQL_USER=sa
SQL_PASSWORD=your_password
SQL_ENCRYPT=false # true for Azure SQL
SQL_TRUST_SERVER_CERTIFICATE=true # true for self-signed certs in dev
SQL_REQUEST_TIMEOUT=30000 # query timeout in ms (default: 30000)PostgreSQL configuration
Option A — Connection string
PG_CONNECTION_STRING=postgresql://myuser:secret@localhost:5432/mydbOption B — Individual parameters
PG_HOST=localhost
PG_PORT=5432 # default: 5432
PG_DATABASE=postgres # default database for queries
PG_USER=myuser
PG_PASSWORD=your_password
PG_SSL=false # true for SSL connections
PG_STATEMENT_TIMEOUT=30000 # query timeout in ms (default: 30000)Option C (optional) — Microsoft Entra (Azure AD) auth
For Azure Database for PostgreSQL with Entra-only authentication, where the
"password" is a short-lived access token rather than a static secret. Set
PG_AZURE_AD_AUTH=true and the server mints a token on demand per connection
via the Azure CLI credential — the equivalent of
az account get-access-token --resource https://ossrdbms-aad.database.windows.net —
caching and refreshing it automatically. No PG_PASSWORD, no stored secret, and no
external refresh process. SSL is forced on.
DB_PROVIDER=postgres
PG_AZURE_AD_AUTH=true
PG_HOST=myserver.postgres.database.azure.com
PG_PORT=5432
PG_DATABASE=mydb
PG_USER=my_entra_principal # the AAD user/group mapped as a PostgreSQL roleRequirements: an active az login in the environment the server runs in, and the
PG_USER principal must be mapped to a PostgreSQL role on the server. This mode is
opt-in — when PG_AZURE_AD_AUTH is unset, connection-string and password auth behave
exactly as before. Use individual parameters (not PG_CONNECTION_STRING) with this mode.
HTTP mode (optional)
Set PORT to start the server in HTTP mode instead of stdio. Required for Docker deployments.
PORT=3000Connecting to Claude Code
Add the server to your Claude Code MCP configuration. The location of the config file depends on your setup:
Project-level:
.claude/settings.jsonin your project rootGlobal:
~/.claude/settings.json
stdio mode (recommended for local use)
{
"mcpServers": {
"sql-mcp": {
"command": "node",
"args": ["C:/Projects/sql-mcp/dist/index.js"],
"env": {
"SQL_CONNECTION_STRING": "Server=myserver,1433;Database=mydb;User Id=myuser;Password=secret;Encrypt=false;TrustServerCertificate=true;"
}
}
}
}Or with individual parameters:
{
"mcpServers": {
"sql-mcp": {
"command": "node",
"args": ["C:/Projects/sql-mcp/dist/index.js"],
"env": {
"SQL_SERVER": "myserver",
"SQL_PORT": "1433",
"SQL_DATABASE": "mydb",
"SQL_USER": "myuser",
"SQL_PASSWORD": "secret",
"SQL_ENCRYPT": "false",
"SQL_TRUST_SERVER_CERTIFICATE": "true"
}
}
}
}Alternatively, place connection details in a .env file at C:/Projects/sql-mcp/.env and omit the env block — the server loads .env automatically on startup.
Using claude mcp add (Claude Code CLI)
The fastest way to register the server without editing JSON:
claude mcp add sql-mcp --scope user -e DB_PROVIDER=mssql -e SQL_SERVER=myserver -e SQL_DATABASE=mydb -e SQL_USER=myuser -e SQL_PASSWORD=secret -e SQL_ENCRYPT=false -e SQL_TRUST_SERVER_CERTIFICATE=true -- node "C:/Projects/sql-mcp/dist/index.js"Use --scope user to make it available across all projects, or --scope project to limit it to the current project.
Connecting to multiple databases
Same server, different databases — no extra configuration needed. Every tool accepts an optional database parameter. A single sql-mcp instance maintains a separate connection pool per database:
"Show me all tables in the
Reportingdatabase"
Claude callslist_tableswithdatabase: "Reporting"automatically.
Different servers — register the server twice under different names:
claude mcp add sql-mcp-prod --scope user -e SQL_SERVER=prod-server -e SQL_USER=reader -e SQL_PASSWORD=secret -- node "C:/Projects/sql-mcp/dist/index.js"claude mcp add sql-mcp-dev --scope user -e SQL_SERVER=dev-server -e SQL_USER=reader -e SQL_PASSWORD=secret -- node "C:/Projects/sql-mcp/dist/index.js"Each registration is an independent process. Claude sees them as distinct MCP servers and can query both in the same conversation.
HTTP mode
If you are running the server in HTTP mode (e.g. via Docker), use the url transport:
{
"mcpServers": {
"sql-mcp": {
"type": "http",
"url": "http://localhost:3000/mcp"
}
}
}Running in HTTP mode (Docker)
HTTP mode is useful when you want a shared server accessible from multiple clients or remote deployments.
Docker Compose
Create a .env file with your connection details (see Configuration), then:
docker compose up --buildThe MCP endpoint will be available at http://localhost:3000/mcp.
A health check endpoint is available at http://localhost:3000 and returns:
{ "name": "sql-mcp", "version": "1.0.0", "tools": 38 }Docker only
docker build -t sql-mcp .
docker run -p 3000:3000 \
-e PORT=3000 \
-e SQL_CONNECTION_STRING="Server=myserver,1433;Database=mydb;User Id=myuser;Password=secret;" \
sql-mcpAvailable tools — SQL Server
All tools return JSON. Most accept an optional database parameter — when omitted, queries run against the database specified in your connection configuration.
list_databases
Lists all online databases on the SQL Server instance.
Parameter | Required | Description |
— | No parameters |
list_schemas
Lists all schemas in a database with their owner.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
list_tables
Lists all base tables in a database.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
describe_table
Returns column definitions for a table: name, data type, nullability, max length, precision, scale, and default value.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table name |
| No | Database name (defaults to configured default) |
get_table_indexes
Returns all indexes on a table, including type, uniqueness, primary key flag, and the list of key columns.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table name |
| No | Database name (defaults to configured default) |
get_foreign_keys
Returns all foreign key constraints for a table: parent and referenced columns, and the delete/update referential actions.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table name |
| No | Database name (defaults to configured default) |
list_views
Lists all views in a database.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
describe_view
Returns column definitions and the full SQL definition for a view.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | View name |
| No | Database name (defaults to configured default) |
list_stored_procedures
Lists all stored procedures in a database with their created and last-altered timestamps.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
get_stored_procedure_definition
Returns the full source definition of a stored procedure. Uses sys.sql_modules to avoid the 4000-character limit of INFORMATION_SCHEMA.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Stored procedure name |
| No | Database name (defaults to configured default) |
list_synonyms
Lists all synonyms in a database with the base object each one points to.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
get_synonym_definition
Returns the base object a synonym resolves to, along with created and modified dates.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Synonym name |
| No | Database name (defaults to configured default) |
list_functions
Lists all user-defined functions (scalar, inline table-valued, multi-statement table-valued, CLR) in a database.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
get_function_definition
Returns the full source definition of a user-defined function.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Function name |
| No | Database name (defaults to configured default) |
list_triggers
Lists all DML triggers in a database with their parent table, events (INSERT/UPDATE/DELETE), enabled state, and INSTEAD OF flag.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by parent table schema |
| No | Filter by parent table name |
get_trigger_definition
Returns the full source definition of a DML trigger.
Parameter | Required | Description |
| Yes | Schema of the parent table (e.g. |
| Yes | Trigger name |
| No | Database name (defaults to configured default) |
get_table_constraints
Returns all constraints defined on a table: PRIMARY KEY, UNIQUE, CHECK, and DEFAULT.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table name |
| No | Database name (defaults to configured default) |
get_extended_properties
Returns all extended properties on a database object and its columns (commonly used to store MS_Description documentation).
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Object name (table, view, procedure, function, etc.) |
| No | Database name (defaults to configured default) |
Each row includes property_name, property_value, scope (object or column), and column_name.
list_sequences
Lists all sequences in a database with data type, range, increment, cycling, and current value.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
get_table_stats
Returns row count and disk space usage (total, used, unused in MB) for a table.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table name |
| No | Database name (defaults to configured default) |
list_database_users
Lists all users in a database with their type, default schema, and mapped login.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
list_database_roles
Lists all database roles and their members. Includes fixed roles and roles with no members.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
get_object_permissions
Returns all explicit permissions granted on a database object (GRANT/DENY/REVOKE).
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Object name (table, view, procedure, etc.) |
| No | Database name (defaults to configured default) |
get_server_properties
Returns SQL Server instance metadata: version, edition, collation, clustering, and HA state. No parameters required.
list_linked_servers
Lists all linked servers configured on the instance. Requires VIEW ANY DEFINITION permission — see Permissions.
No parameters.
list_agent_jobs
Lists all SQL Server Agent jobs with enabled state, category, owner, and last run outcome. Requires SQLAgentUserRole in msdb — see Permissions.
No parameters.
get_job_history
Returns execution history for a SQL Server Agent job. Requires SQLAgentUserRole in msdb — see Permissions.
Parameter | Required | Description |
| Yes | Exact job name |
| No | Number of most-recent entries to return (default: 50, max: 500) |
list_partition_functions
Lists all partition functions in the database, including range type (LEFT/RIGHT), partition count, and boundary values.
No parameters.
list_partition_schemes
Lists all partition schemes with the function they use and the filegroups mapped to each partition.
No parameters.
list_fulltext_catalogs
Lists all full-text search catalogs in a database with item count, size in MB, and populate status.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
list_fulltext_indexes
Lists all full-text indexes with catalog name, indexed columns, and change-tracking state.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
list_service_queues
Lists all Service Broker queues with enqueue/receive/activation state and activation procedure.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
list_broker_services
Lists all Service Broker services and the queue each is bound to.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
list_user_types
Lists all user-defined scalar types and table types, including the underlying base type.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
get_table_type_columns
Returns the column definitions for a user-defined table type.
Parameter | Required | Description |
| Yes | Schema name (e.g. |
| Yes | Table type name |
| No | Database name (defaults to configured default) |
list_temporal_tables
Lists all system-versioned temporal tables in a database, showing the linked history table for each.
Parameter | Required | Description |
| No | Database name (defaults to configured default) |
| No | Filter by schema name (e.g. |
execute_query
Executes a read-only SELECT query and returns the result set.
Parameter | Required | Description |
| Yes | A |
| No | Database to run the query against |
| No | Row cap (default: 1000, max: 5000) |
Returns:
{
"rows": [ { "col1": "value", "col2": 42 } ],
"row_count": 1,
"truncated": false
}truncated is true when the result set exceeded max_rows. Use TOP or FETCH NEXT in your query for better performance on large tables.
Available tools — PostgreSQL
Set DB_PROVIDER=postgres to use these tools. PostgreSQL-specific introspection uses information_schema and pg_catalog.
Tool | Description |
| All non-template databases with size and encoding |
| User-defined schemas (excludes system schemas) |
| Base tables with optional schema filter and total size |
| Column definitions — type, nullability, default, comments |
| Indexes including type, uniqueness, and definition SQL |
| Foreign key constraints with update/delete rules |
| Views with updatability flags |
| Column definitions + view definition SQL |
| User-defined functions and procedures with signatures |
| Full source definition via |
| Triggers with optional schema/table filter |
| Trigger definition via |
| Sequences with start, min, max, increment, and last value |
| Row count, live/dead rows, table/index sizes, vacuum times |
| Version, current user/database, memory config, total size |
| Ad-hoc read-only SELECT query |
Permissions
Most tools work with db_datareader on the target database plus VIEW DEFINITION for source definitions. A few tools require elevated permissions:
Tool(s) | Required permission | Reason |
|
| Agent job tables live in |
|
|
|
|
| Required to read |
To grant SQLAgentUserRole in msdb:
USE msdb;
CREATE USER sql_mcp_reader FOR LOGIN sql_mcp_reader;
ALTER ROLE SQLAgentUserRole ADD MEMBER sql_mcp_reader;To grant VIEW ANY DEFINITION at the server level:
GRANT VIEW ANY DEFINITION TO sql_mcp_reader;Read-only enforcement
The server enforces read-only access at two layers:
Application layer —
execute_queryvalidates the query before it reaches SQL Server. It strips SQL comments, checks that the statement starts withSELECTorWITH, and blocks any query containing write keywords (INSERT,UPDATE,DELETE,DROP,CREATE,ALTER,TRUNCATE,EXEC,EXECUTE,MERGE,GRANT,REVOKE,DENY,BULK,OPENROWSET,OPENDATASOURCE). The schema exploration tools (list_tables,describe_table, etc.) use parameterised queries against read-only system views only.Database layer (recommended) — Create a dedicated SQL Server login with only
db_datareadermembership (andVIEW DEFINITIONif you need stored procedure source). This is the primary safeguard and ensures read-only access even if the application layer is bypassed.
-- Create a dedicated read-only login
CREATE LOGIN sql_mcp_reader WITH PASSWORD = 'strong_password_here';
-- In each database you want to expose:
USE [your_database];
CREATE USER sql_mcp_reader FOR LOGIN sql_mcp_reader;
ALTER ROLE db_datareader ADD MEMBER sql_mcp_reader;
-- Optional: allow reading stored procedure / view definitions
GRANT VIEW DEFINITION TO sql_mcp_reader;Note: Write access (
INSERT,UPDATE,DELETE) is not supported in the current version. TheSQL_ACCESS_LEVELenvironment variable is reserved for a future release that will make the access level configurable.
Policy / Data Privacy
Four environment variables let you restrict access and mask sensitive data without modifying SQL Server permissions.
Variable | Description |
| Comma-separated list of schemas the MCP may access. When unset, all schemas are accessible. |
| Comma-separated |
| Comma-separated |
| Hard cap on rows returned by any tool (default: |
Example:
SQL_ALLOWED_SCHEMAS=dbo,reporting
SQL_BLOCKED_TABLES=dbo.audit_log,hr.salaries
SQL_MASKED_COLUMNS=dbo.users.ssn,dbo.users.credit_card,dbo.employees.salary
SQL_MAX_ROWS=1000Behaviour:
Schema allowlist — any tool call that specifies a
schemaargument not in the allowlist is rejected before the query runs.Table blocklist — blocked tables are filtered from
list_tables,list_views, andlist_temporal_tablesresults, and direct access viadescribe_table,get_table_indexes, etc. is rejected.execute_querychecks the raw SQL text for blocked table references.Column masking — matched column values are replaced with
[MASKED]in the response. The original data is never sent to the client.Row cap —
execute_queryrespects the lower of the caller's requestedmax_rowsandSQL_MAX_ROWS.
These controls operate at the MCP layer. For defence in depth, combine them with database-level permissions (see Read-only enforcement).
Audit Logging
Every tool call is recorded — including blocked requests. Records are written to two sinks simultaneously:
File sink
A daily-rotating JSON log file is written to ${AUDIT_LOG_PATH}/audit-YYYY-MM-DD.log (UTC date). Each line is a JSON object:
{
"ts": "2026-04-13T14:23:01.456Z",
"tool": "describe_table",
"database_name": "MyApp",
"schema_name": "dbo",
"object_name": "users",
"query_hash": "e3b0c44298fc1c149afb...",
"row_count": 12,
"masked_cols": "[\"ssn\",\"credit_card\"]",
"blocked": false,
"block_reason": null,
"duration_ms": 42
}Set AUDIT_LOG_PATH to change the directory (default: logs/). The directory is created automatically.
SQL sink
Set AUDIT_CONNECTION_STRING (or AUDIT_DATABASE to reuse the main connection params with a different database) to also insert records into a SQL table.
Create the table before enabling the SQL sink:
CREATE SCHEMA audit;
CREATE TABLE audit.mcp_audit_log (
id BIGINT IDENTITY(1,1) PRIMARY KEY,
logged_at DATETIME2(3) NOT NULL DEFAULT SYSUTCDATETIME(),
tool NVARCHAR(100) NOT NULL,
database_name NVARCHAR(128) NULL,
schema_name NVARCHAR(128) NULL,
object_name NVARCHAR(128) NULL,
query_hash CHAR(64) NULL,
row_count INT NULL,
masked_cols NVARCHAR(MAX) NULL,
blocked BIT NOT NULL DEFAULT 0,
block_reason NVARCHAR(500) NULL,
duration_ms INT NULL
);The audit login needs only INSERT permission on audit.mcp_audit_log:
GRANT INSERT ON audit.mcp_audit_log TO sql_mcp_audit_writer;Fault tolerance: audit write failures (file permission errors, SQL connectivity issues) are logged to stderr and never propagate to the tool response. A failed audit write does not block the tool from returning its result.
Adding a new provider
The provider factory makes it straightforward to add support for any database engine (MySQL, SQLite, Oracle, etc.).
1. Scaffold the skeleton
npm run scaffold -- mysqlThis creates src/providers/mysql/ with a working skeleton: client.ts, index.ts, and stub tool files for databases, schemas, tables, and execute_query.
2. Install your driver
npm install mysql2
npm install --save-dev @types/mysql23. Implement sqlQuery() in client.ts
Wire up your driver's connection pool and query execution. The function signature is already in place — replace the throw new Error("Not implemented") stub with your driver code.
4. Fill in the tool queries
Each stub tool file has a /* TODO */ placeholder with example SQL for PostgreSQL and MySQL as reference. Replace them with queries for your engine's system catalog.
5. Register the provider in src/index.ts
if (providerName === "mysql") {
const m = await import("./providers/mysql/index.js");
return { provider: m.mysqlProvider, checkEnv: m.checkEnv };
}6. Build and test
npm run build
DB_PROVIDER=mysql node dist/index.jsDevelopment
# Run directly with tsx (no build step needed)
npm run dev
# Build TypeScript to dist/
npm run build
# Start the compiled server
npm start
# Open the MCP Inspector UI in a browser (useful for testing tools interactively)
npm run inspectThe server logs startup information and errors to stderr, keeping stdout clean for the MCP stdio transport.
Available Tools
37 toolsdescribe_tableB
Get column definitions for a table
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It only implies a read operation ('Get') but does not disclose return structure, required permissions, or potential limitations, giving the agent minimal 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 a single, efficient sentence with no filler. It is front-loaded with the action and resource, making it appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain return values, but it omits details about what 'column definitions' include (e.g., data types, nullability). Parameters are fully documented, and the purpose is clear, but the lack of return information leaves the agent guessing.
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 already provides full descriptions for all three parameters (table, schema, database) with 100% coverage. The description adds no extra meaning beyond what the schema states, 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?
The description clearly states 'Get column definitions for a table', using a specific verb and resource. It distinguishes from siblings like 'describe_view' and 'get_table_indexes' by specifying column definitions and tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like describe_view or get_table_constraints. The description simply states what it does without addressing selection criteria or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_viewA
Get column definitions and the SQL definition for a view
| Name | Required | Description | Default |
|---|---|---|---|
| view | Yes | View name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states the basic function ('Get column definitions and the SQL definition') without revealing whether special permissions are required, potential error cases, or the exact structure of the returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise, front-loaded with the action, and contains no filler. It efficiently communicates the core functionality without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately hints at the return content ('column definitions and the SQL definition'), which is sufficient for a simple describe tool. However, it lacks details about the format of the column definitions or any prerequisites, but the tool's simplicity and comprehensive schema make this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all three parameters (view, schema, database), so the description does not need to add parameter details. The description's mention of 'view' aligns with the schema but adds no new semantics 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 uses the specific verb 'Get' and identifies the resource as 'a view', while specifying the exact outputs: 'column definitions and the SQL definition'. This clearly distinguishes it from sibling tools like describe_table (for tables) and get_stored_procedure_definition (for procedures).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for viewing metadata about a view, but it does not explicitly state when to use it over alternatives such as describe_table or get_function_definition. There is no mention of exclusions or when-not-to-use scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_queryA
Execute a read-only SELECT query against the SQL Server. Only SELECT statements (and CTEs using WITH) are permitted. Use TOP or FETCH NEXT in your query for large tables to avoid excessive data transfer. Results are capped at 1000 rows by default.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The SELECT query to execute | |
| database | No | Database to run the query against (defaults to the configured default database) | |
| max_rows | No | Maximum number of rows to return (default: 1000, max: 5000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on full disclosure duty. It explicitly states read-only, limits query types to SELECT/WITH, and mentions the default 1000-row cap. This covers the most critical safety and behavioral aspects, though it omits details like error handling or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: action, constraint, and performance tip. No redundancy or filler, and the most important 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 tool with 3 simple parameters and no output schema, the description adequately covers the key context: read-only nature, allowed query constructs, and result size limits. A minor gap is not describing the return format, but that is not critical for a query execution 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 has 100% parameter coverage, giving a baseline of 3. The description adds the crucial semantic constraint that only SELECT/WITH statements are allowed, which is not present in the schema, and clarifies the default row cap behavior for max_rows. This meaningfully augments the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool executes a read-only SELECT query against SQL Server, which is a specific verb+resource combination. It distinguishes itself from sibling metadata tools by being the only one that runs arbitrary 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?
It provides constraints (SELECT-only, row cap) and practical advice (TOP/FETCH), but does not explicitly say when to prefer this tool over sibling tools like list_tables or describe_table. The usage context is implied rather than stated with exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_extended_propertiesA
Get all extended properties (e.g. MS_Description documentation) for a table, view, procedure, or function — includes both the object-level and all column-level properties
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Object name (table, view, stored procedure, function, etc.) | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the key behavioral traits: returns all extended properties, explicitly including both the object-level and all column-level properties, and gives a common example (MS_Description). This goes beyond just the name, though it does not mention error behavior or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the main purpose and e.g. example. Every word earns its place without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, no output schema, and no annotations, the description is fairly complete: it states what is returned (all object and column-level properties) and gives a concrete use case. A bit more detail about the return format or empty result behavior would push it to 5, but it is adequate for a simple metadata getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with descriptions for all three parameters (schema, name, database). The tool description adds no additional parameter-level details, so a 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 clearly states the verb ('Get'), the resource ('all extended properties'), and the scope ('for a table, view, procedure, or function'), including both object-level and column-level properties. This distinguishes it from sibling metadata tools like describe_table or get_table_indexes.
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 clear context for when to use this tool (to retrieve extended properties/documentation for various object types) and distinguishes its scope from other metadata tools. However, it does not explicitly mention when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_foreign_keysB
Get all foreign key relationships for a table
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not explicitly state that the operation is read-only, has no side effects, or that it queries system catalog metadata. The verb 'Get' implies a query, but this is not explicit enough for a tool with no safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately conveys the action and target. It contains no redundant words and is appropriately sized for a simple metadata query.
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 has no output schema, so the description should clarify what a 'foreign key relationship' entails (e.g., constraint name, referenced table/columns), but it does not. It also lacks mention of permissions or the default database behavior, leaving the agent with insufficient information about the return format and edge 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?
The input schema covers all three parameters with descriptions (100% coverage), so the baseline is 3. The description itself adds no extra parameter detail beyond saying 'for a table', which matches the 'table' parameter. It does not clarify relationships between schema, table, and database or enhance the minimal schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('all foreign key relationships') and scope ('for a table'). This clearly distinguishes it from sibling tools like get_table_indexes, which are about indexes, and get_table_constraints, which could also include foreign keys but is broader.
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 no guidance on when to use this tool versus alternatives. It does not mention that get_table_constraints might also return foreign keys, nor does it specify that this tool is best for exploring referential integrity. There is no when-to-use or exclusionary context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_function_definitionA
Get the full source definition of a user-defined function
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Function name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose that the tool returns the full source definition and is limited to user-defined functions, which is useful. However, it does not mention permissions, error behavior, or exact return format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loaded with the verb 'Get', and contains no filler or redundant 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 read-only tool with no output schema, the description adequately conveys the result (full source definition) and scope (user-defined function). It doesn't explain error handling or permissions, but these are not critical for this tool's straightforward purpose.
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 already documents all three parameters with clear descriptions (function name, schema name, optional database). The description adds no parameter-specific semantics beyond what the schema 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?
The description uses the specific verb 'get' and clearly identifies the resource as 'the full source definition of a user-defined function'. This distinguishes it from sibling tools like list_functions or get_stored_procedure_definition.
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 no guidance on when to use this tool versus alternatives, mentions no exclusions, and does not suggest alternative tools. It simply states what the tool does without context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_historyA
Get execution history for a SQL Server Agent job. Requires membership in SQLAgentUserRole (or higher) in the msdb database.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Number of most-recent history entries to return (default: 50, max: 500) | |
| job_name | Yes | Exact job name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for disclosing behavior. It does disclose the permission requirement, which is valuable. However, it does not explain the return format or any side effects (e.g., whether it's read-only, what the entries contain), leaving some behavioral details unspecified.
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 just two sentences, front-loaded with the core action and followed by a necessary permission note. Every word earns its place with no 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 simple two-parameter get tool with no output schema, the description is adequate but not rich. It states purpose and permission, but lacks any detail on what the history entries include or how to interpret the result. It also doesn't explicitly relate to sibling list_agent_jobs. Given no output schema, the description could do slightly more to be complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage of both parameters with descriptions ('Exact job name' and 'Number of most-recent history entries to return (default: 50, max: 500)'). The tool description adds no additional parameter meaning, 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?
The description uses a specific verb ('Get') and resource ('execution history for a SQL Server Agent job'), clearly distinguishing it from sibling tool list_agent_jobs which lists jobs themselves. No ambiguity about 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 a clear prerequisite ('Requires membership in SQLAgentUserRole (or higher) in the msdb database'), which is concrete usage context. However, it does not explicitly mention when to prefer this over list_agent_jobs or other alternatives, but the purpose makes this largely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_object_permissionsA
Get all explicit permissions granted on a specific database object
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Object name (table, view, procedure, etc.) | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It clarifies that only 'explicit' permissions are returned, which is useful behavioral context. However, it does not disclose whether inherited permissions are excluded, whether any special privileges are needed to run it, or the structure of the returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that clearly states the tool's function. It is concise and free of unnecessary wording, leaving no ambiguity about what the tool does.
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 relatively simple, with a clear purpose and well-documented parameters. The description adequately conveys the core behavior, though it could be more complete by noting the absence of effective permission calculation or the exact list of permission types returned. Given the low complexity, this is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for all three parameters (name, schema, database), giving 100% coverage. The description adds no additional parameter-specific semantics beyond the tool's overall purpose, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' and a clear resource 'explicit permissions granted on a specific database object'. This clearly distinguishes it from siblings like list_database_roles and list_database_users, which focus on roles and users rather than object permissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you need object-level permissions, this is the tool. However, it provides no explicit guidance on when not to use it or how it differs from alternatives such as querying system views via execute_query. No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_propertiesA
Get SQL Server instance properties: version, edition, collation, clustering, and HA configuration
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It is a read-only getter and that is implicitly clear, but it doesn't disclose potential prerequisites, performance characteristics, or the exact shape of the returned properties. It lists examples but does not explicitly state whether the output is a single object with these fields or if additional fields are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that leads with the verb and resource, followed by examples. Every word earns its place, and there is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters and no output schema. The description provides a clear sense of what to expect (server instance properties, with specific examples). However, it doesn't outline the exact return structure or mention whether it returns all properties or only the listed ones, leaving slight ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema coverage is trivially 100%. The description adds meaning by naming the specific property groups returned, but since there are no parameters, the baseline is 4 per the rubric. No further parameter explanation 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 starts with the specific verb 'Get' and clearly names the resource as 'SQL Server instance properties', listing concrete examples (version, edition, collation, clustering, HA configuration). This distinguishes it clearly from sibling tools that operate on tables, views, procedures, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use for retrieving server-level configuration rather than database objects, providing clear context among siblings. It doesn't explicitly state when not to use it, but the unique scope makes the usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stored_procedure_definitionB
Get the full source definition of a stored procedure
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Stored procedure name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure, but it only states the basic action. It does not mention permission requirements, return format, error behavior, or the database default, leaving the agent without important context for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the essential action without any redundant words or filler. It is appropriately concise for a straightforward retrieval tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the core purpose and the parameters are fully documented in the schema. However, given there is no output schema or annotations, it would benefit from clarifying what the returned definition looks like and any access prerequisites. It is minimal but not severely deficient.
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 parameter descriptions are clear and self-sufficient. The tool description adds no additional parameter-level meaning, but the schema already provides adequate semantics, 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 uses a specific verb ('Get') and resource ('full source definition of a stored procedure'), clearly distinguishing it from sibling tools like get_function_definition, get_trigger_definition, and get_synonym_definition. Its scope is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as list_stored_procedures or execute_query. The description states what the tool does but offers no context for selection or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_synonym_definitionB
Get the base object a synonym points to
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Synonym name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states what it returns (the base object) but does not disclose whether the operation is read-only, requires special permissions, or how it handles missing synonyms. This is a notable gap for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that conveys the essential purpose without any unnecessary words. It is perfectly sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool, the description provides the core purpose but does not elaborate on the return value format or behavior edge cases. Given the absence of an output schema, a bit more context (e.g., what the base object looks like) would improve completeness, but the tool's low complexity makes the current description minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with clear descriptions for 'name', 'schema', and 'database'. The tool description adds no additional parameter information, so it correctly falls to the baseline of 3.
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 'Get the base object a synonym points to' clearly states the verb (Get) and resource (synonym) and specifies the outcome (base object). It is specific enough to distinguish from sibling tools like list_synonyms, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use when you need to resolve a synonym to its underlying object. However, it does not provide explicit guidance on when to use it over alternatives or mention any exclusions, which places it at the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_constraintsA
Get all constraints on a table: PRIMARY KEY, UNIQUE, CHECK, and DEFAULT
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly states the operation is read-only ('Get') and delimits the scope by listing four constraint types, implicitly excluding foreign keys. However, it does not disclose output format, ordering, permissions, or behavior with empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler words, stating the action and the key constraint types.
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 metadata-read operation with fully documented parameters. The description covers what is returned (four constraint types) and is sufficient for the low complexity, though no output schema exists and return shape is not described.
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?
All three parameters have schema descriptions (100% coverage), so the schema already explains table, schema, and database. The description provides no additional parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and a clear resource ('all constraints on a table'), explicitly enumerates constraint types (PRIMARY KEY, UNIQUE, CHECK, DEFAULT), and naturally differentiates from sibling tools like get_foreign_keys and get_table_indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as get_foreign_keys or describe_table. The description only states what it does, not when to choose it, nor does it mention any exclusions like 'for foreign keys, use get_foreign_keys'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_indexesA
Get all indexes defined on a table
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action ('get') without mentioning read-only nature, output format, potential errors, or any side effects. This is minimal and leaves safety and behavior assumptions implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with no wasted words. It conveys the core purpose efficiently and is appropriately sized for a simple metadata retrieval 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?
Given the simple nature of the tool and rich sibling context, the description is adequate but lacks details about return values (no output schema) and does not clarify behavior like whether all index types are included. It is sufficient for a basic understanding but leaves some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter (table, schema, database) having a clear description. The tool description adds no additional meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get all indexes defined on a table' uses a specific verb (get) and resource (all indexes on a table), clearly distinguishing it from sibling tools like get_foreign_keys or get_table_constraints. It precisely states what is retrieved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when indexes on a table are needed, but provides no explicit guidance on when to choose this tool over alternatives or any exclusions. It does not mention specific scenarios or prerequisites beyond the required table and schema parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_statsA
Get row count and disk space usage (total, used, unused) for a table
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | Table name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility. It indicates a read-only retrieval of metrics, but does not disclose potential performance implications, permission requirements, or how the statistics are computed. Minimal but sufficient to understand the core 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 a single, front-loaded sentence with no redundant information. Every word contributes to the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple stats tool with no output schema, the description covers the key outputs (row count and disk space usage) and the schema covers parameters. It lacks details on return formatting or edge cases, but is adequate for typical 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?
All three parameters are described in the input schema, providing 100% coverage. The description does not add additional parameter-level meaning beyond the schema, 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?
The description clearly states the tool retrieves row count and disk space usage (total, used, unused) for a table. This is a specific verb+resource pair that distinguishes it from sibling metadata tools like describe_table or get_table_indexes.
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 tool's purpose is clear, and it implicitly conveys when to use it (when table statistics are needed). However, there is no explicit guidance about when not to use it or which alternative to prefer, such as describe_table or get_table_indexes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_type_columnsA
Get the column definitions for a user-defined table type
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Table type name | |
| schema | Yes | Schema name (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the sole source of behavioral transparency. The verb 'Get' implies a read-only operation, but the description does not disclose any potential permission requirements or the exact shape of the returned column definitions, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and object, with no unnecessary words. Every part of the sentence adds meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description is adequate for a basic understanding, it lacks any indication of what the returned column definitions include (e.g., name, data type, nullability) and any prerequisites such as permissions. With no output schema and no annotations, this thinness leaves the agent with unanswered questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage for all three parameters, so the description is not required to add parameter details. The description itself does not go beyond the schema, but this is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('column definitions for a user-defined table type'), making its purpose unmistakable. It clearly distinguishes itself from siblings like describe_table (for regular tables) and list_user_types (which lists types but not columns).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the target resource ('user-defined table type'), giving an agent clear context for when to use this tool. It does not mention explicit exclusions or alternatives, but the specificity of the resource provides sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trigger_definitionA
Get the full source definition of a DML trigger
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Trigger name | |
| schema | Yes | Schema of the parent table the trigger belongs to (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the action ('Get') but does not disclose permissions required, error behavior if trigger not found, or the exact return format. For a read operation, more detail could be provided, such as whether the source is returned as a string.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It clearly conveys the tool's purpose without redundant phrasing.
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 tool with three parameters and no output schema, the description sufficiently covers the core purpose. It could mention return value details, but the phrase 'full source definition' implies the output. The lack of annotations is partially compensated by the simplicity of the operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no extra parameter-specific semantics beyond what the schema provides, fitting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and clearly identifies the resource ('full source definition of a DML trigger'). It distinguishes from sibling tools like list_triggers (which lists) and other get_*_definition tools by specifying trigger type and source definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you need the definition of a DML trigger) but does not explicitly mention alternatives or when not to use it. No exclusions are provided, such as 'for DDL triggers use X'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agent_jobsA
List all SQL Server Agent jobs with their enabled state, category, owner, and last run outcome. Requires membership in SQLAgentUserRole (or higher) in the msdb database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden of disclosure. It states the required role and the output fields, implying a read-only list operation. It does not discuss edge cases or side effects, but the behavior is straightforward and 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 is two sentences, with the first sentence front-loading the purpose and returned fields, and the second adding the permission requirement. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, no annotations, and no output schema, the description covers all necessary context: what is listed, the fields returned, and the permission required. An agent can invoke this tool correctly based solely on this description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% trivially. With 0 params, the baseline is 4, and the description correctly needs to add no parameter-specific details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all SQL Server Agent jobs and specifies the returned attributes (enabled state, category, owner, last run outcome). This distinguishes it from sibling list tools that target other database objects.
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 clear purpose and a specific permission requirement (SQLAgentUserRole in msdb) that indicates when the tool can be used. It does not name alternative tools or exclusion conditions, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_broker_servicesA
List all Service Broker services in a database and the queue each binds to
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. 'List' implies read-only, and it specifies the output includes bound queues. However, it does not mention permissions, whether system services are included, or any error conditions. This is acceptable for a simple list but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that covers the action, resource, scope, and output in a clear, efficient manner with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature (one optional parameter, no output schema), the description is largely sufficient: it states what is listed (services) and what is returned (bound queues). It could be more explicit about the result set shape, but for a catalog listing this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single parameter (database name with default behavior), so the description adds no extra meaning. Baseline 3 applies since schema coverage is 100%.
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 (List), the resource (Service Broker services), the scope (in a database), and an additional detail (the queue each binds to). This distinguishes it from sibling tools like list_service_queues and covers the essential 'what'.
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 usage is implied by the description—listing broker services—but there is no explicit guidance on when to use this tool versus alternatives, nor any mention of exclusions. For a straightforward list tool, this is adequate but not highly instructive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_database_rolesA
List all database roles and their members. Uses LEFT JOIN so roles with no members are included.
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explicitly discloses the LEFT JOIN behavior, which is a meaningful detail because it ensures roles with no members are included. This is a non-obvious behavior that could affect interpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences that are entirely value-dense. The first sentence conveys the core purpose, and the second adds an important behavioral nuance. No unnecessary words 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 tool with one optional parameter and no output schema, the description is sufficient. It explains what is returned (roles and members) and covers a key edge case (empty roles). However, it does not provide guidance on output structure or distinguish from sibling tools, leaving slight room for improvement.
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 already provides a full description of the only parameter ('database') including its default behavior. The description adds no additional parameter-specific information, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'database roles and their members', making the tool's function immediately obvious. It also distinguishes itself from sibling tools like list_database_users by focusing on roles rather than users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when needing roles and their members), but it provides no explicit guidance on when not to use it or alternatives. There is no mention of trade-offs compared to similar tools like list_database_users.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_databasesA
List all online databases on the SQL Server instance
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosure. It adds valuable behavioral context by specifying 'online' databases, implying that offline or unavailable databases are not included. This is a useful filter not present in the tool's name and helps set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no redundancy. Every word adds meaning, efficiently conveying the tool's purpose and scope.
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 low complexity with no parameters or output schema. The description sufficiently covers the essential context: what is listed and the filter applied. It does not describe the return format, but for a simple list operation, that 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?
The tool has zero parameters, so the baseline is 4. The description correctly does not attempt to explain nonexistent parameters, and the input schema is an empty object, making parameter semantics trivially clear.
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's function with a specific verb ('List'), a specific resource ('databases'), and a scope ('on the SQL Server instance'). It is easily distinguishable from sibling tools that target other objects like roles, schemas, or tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context of use is clear: the agent should use this when it needs to enumerate databases on the server. No explicit exclusions are given, but the description itself implies the primary use case, which is sufficient for a simple parameterless list tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_database_usersA
List all users in a database with their type, default schema, and mapped login
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the burden. It clearly indicates a read-only list operation and specifies returned fields, but it does not mention any required permissions, limitations, or behavior when the database parameter is omitted (though the schema covers the default).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and resource, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description covers the purpose, result content, and parameter context adequately. It lacks an output schema but the returned fields are listed. Minor gaps include no mention of ordering or permissions, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional parameter, with a clear description in the schema. The tool description does not add additional parameter semantics beyond referring to the database context.
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 the specific verb 'List' with the resource 'all users in a database' and enumerates the returned fields (type, default schema, mapped login), clearly distinguishing it from sibling tools like list_database_roles or list_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 does not explicitly provide when-to-use vs alternatives. It implies usage when users need to be listed but provides no exclusionary guidance or alternative tool recommendations, though the sibling list offers context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fulltext_catalogsA
List all full-text search catalogs in a database with item count, size, and populate status
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds transparency by listing the output fields, but it does not mention whether the operation is read-only, how it handles non-existent databases, or any other behavioral traits. This is adequate for a simple list tool but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-formed sentence that front-loads the action and resource, then specifies the key output fields. It is concise with no unnecessary words 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 listing tool with one optional parameter and no output schema, the description is largely complete: it states the scope and output fields. The main gap is the lack of usage guidance about when to choose this over related sibling tools, which is a minor deficiency 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?
The schema description for the 'database' parameter is already fully specified (defaults to configured default database). The description adds no additional semantic value beyond what the schema 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 clearly states the tool lists all full-text search catalogs and specifies the returned attributes (item count, size, populate status). The resource is specific and the verb 'List' is appropriate, distinguishing it from the sibling tool list_fulltext_indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as list_fulltext_indexes. The description implies usage by stating what it does, but it does not clarify the relationship between catalogs and indexes or any specific contexts where one would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fulltext_indexesA
List all full-text indexes in a database, showing the catalog, indexed columns, and change-tracking state
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the transparency burden. The word 'List' implies a read-only operation, and the description adds output details (catalog, indexed columns, change-tracking state). However, it does not explicitly mention permissions, error conditions, or that it performs no modifications, which would be valuable without 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, front-loaded sentence that efficiently conveys the action, scope, and output fields. No superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with no output schema, the description covers the main purpose and return values. It could add minor details like filtering behavior or read-only nature, but the schema and description together are sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both parameters have clear descriptions in the schema. The tool description does not add additional parameter semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource ('all full-text indexes in a database'), and enumerates the output details (catalog, indexed columns, change-tracking state). This distinguishes it from sibling tools like list_fulltext_catalogs or get_table_indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when you need full-text index metadata, but does not explicitly state when to use it over alternatives (e.g., list_fulltext_catalogs) or mention any exclusions. It lacks explicit 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.
list_functionsA
List all user-defined functions in a database (scalar, inline table-valued, and multi-statement table-valued), optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the scope (user-defined functions) and optional schema filtering, but it does not mention what the return format is, what permissions are needed, or any pagination/limits. These are meaningful gaps for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the action, target, function types, and optional filter. No wasted words; all essential 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?
The tool is simple, but with no annotations and no output schema, the description should provide more context about return values or prerequisites. It covers the core usage well but leaves uncertainty about the output structure and any limitations.
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 documents both parameters (schema, database) with descriptions, achieving 100% schema coverage. The description only reiterates the schema filter and does not add additional semantic value beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List all user-defined functions in a database'), enumerates the specific function types (scalar, inline table-valued, multi-statement table-valued), and mentions optional schema filtering. This distinguishes it from sibling tools like list_tables or list_views.
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 makes the tool's purpose clear and the optional schema filter provides a common use case. However, it does not explicitly state when to use this tool over alternatives like get_function_definition or list_tables, nor does it mention exclusions. The context is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_linked_serversA
List all linked servers configured on the SQL Server instance. Requires VIEW ANY DEFINITION or sysadmin — will return an empty result set if the login lacks this permission.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It reveals a key behavior: the tool requires certain permissions and returns an empty result set if the login lacks them. This goes beyond a generic 'list' and aids the agent in anticipating outcomes.
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 and front-loaded, consisting of two sentences. The first sentence states the core action, and the second adds a crucial permission caveat. No unnecessary words 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?
Given the tool's simplicity (no parameters, no output schema), the description is fully complete for selection and invocation. It covers the main purpose and the critical permission behavior, which is sufficient for an agent to decide when and how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty schema). The baseline for 0 params is 4. The description adds no parameter information, but none 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 clearly states the tool's function: 'List all linked servers configured on the SQL Server instance.' This uses a specific verb ('List'), specifies the resource ('linked servers'), and scopes it to the instance. It is distinct from sibling tools which target other database objects like tables, roles, or 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 makes it clear when to use this tool: when you need to list linked servers. It also provides a prerequisite (VIEW ANY DEFINITION or sysadmin) and notes the empty result behavior on permission failure. While it doesn't explicitly name alternatives, the resource specificity among siblings provides sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_partition_functionsA
List all partition functions in the current database, including range type, partition count, and boundary values
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since annotations are absent, the description carries the burden of disclosing behavior. The verb 'List' implies a read-only operation, and the phrase 'including range type, partition count, and boundary values' clearly communicates what the agent can expect in the result. It does not describe potential side effects, but none are relevant for a listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence that front-loads the verb and resource. Every word adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (no parameters, no output schema), the description sufficiently covers what the tool returns and the scope. It is complete for an agent to correctly select and invoke 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?
The input schema has zero parameters, so the description does not need to elaborate on parameter meaning. The baseline for 0 parameters is 4, and the description adds no unnecessary details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('List'), specifies the resource ('partition functions'), and defines the scope ('in the current database'). It also differentiates from siblings by focusing on partition functions specifically, not general functions or partition schemes.
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 the context for use (listing partition functions in the current database), making it obvious when to apply. It does not explicitly mention alternatives or exclusions, but the tool name and scope provide sufficient context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_partition_schemesA
List all partition schemes in the current database, showing which partition function each uses and the mapped filegroups
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the responsibility for behavioral disclosure. The word 'List' implies a read-only operation, and the description details the returned information, but it does not explicitly state lack of side effects, required permissions, or any limitations. This is acceptable for a simple listing tool but leaves some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is concise and front-loaded with the action and resource. It provides essential detail (function and filegroup mapping) without any fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking annotations and an output schema, the description adequately covers the tool's purpose and result contents for a zero-parameter operation. It does not explain return format or edge cases, but the simple scope makes this largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4. The description does not need to explain parameters but adds meaningful context about the tool's output scope and contents, which indirectly aids 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 uses the specific verb 'List' with a clear resource ('partition schemes') and scope ('current database'). It also specifies the key output aspects ('which partition function each uses and the mapped filegroups'), which distinguishes it from sibling tools like list_partition_functions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating it lists partition schemes in the current database, but it does not explicitly mention when to use this over alternatives or provide any exclusions. Sibling tools are distinguishable by name but no direct comparison is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schemasB
List all schemas in a database
| Name | Required | Description | Default |
|---|---|---|---|
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden. It indicates a read-only listing operation but does not disclose permissions needed, whether system schemas are included, error behavior, or return format. This is minimal beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short, front-loaded sentence with no filler or redundant content. Every word contributes to meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with one optional parameter and no annotations, the description is largely complete. It states the action, scope, and object type. The lack of an output schema is mitigated by the obvious return of a list of schema names, though not explicitly stated.
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 database parameter is already documented with a clear default behavior. The description adds no additional parameter information, so it meets the baseline without compensating for gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('schemas') with a clear scope ('in a database'). It distinguishes itself from siblings like list_tables and list_views by naming the exact object type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as list_tables or list_databases. There is no explicit when/when-not or mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sequencesA
List all sequences in a database, optionally filtered by schema. Shows data type, range, increment, cycling, and current value.
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by revealing the output fields. It implicitly indicates a read-only metadata operation, avoiding any ambiguity about side effects. It does not discuss permissions, but for a simple listing tool this is acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the action, optional filter, and output fields without any wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple list tool with no output schema, and the description compensates by naming the specific attributes returned. It provides enough context for an agent to invoke the tool correctly and understand what it will receive.
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 already fully describes both parameters (schema and database) with 100% coverage. The description adds 'optionally filtered by schema' but does not provide additional detail beyond the schema descriptions, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all sequences in a database, with an optional schema filter. It enumerates the returned properties (data type, range, increment, cycling, current value), making the purpose specific and distinct from sibling tools like list_tables or list_views.
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 clear usage context (list sequences, filter by schema, target a database), but does not explicitly mention when to prefer this over alternatives or provide exclusions. The use case is self-evident given the unique resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_service_queuesA
List all Service Broker queues in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It accurately states a read-only listing behavior and an optional schema filter, but it does not disclose any caveats such as system-queue inclusion, permission requirements, or result set details. This is acceptable for a simple list tool but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence, front-loaded with the action and resource, and contains no redundant or vague wording. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (two optional parameters, no nested objects, no output schema), the description is sufficiently complete for a straightforward listing tool. The database parameter is not mentioned in the description, but it is fully specified in the schema, so the overall context is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters well. The description adds only 'optionally filtered by schema,' which is already implied by the optional schema property. No meaningful extra parameter semantics are provided 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 has a specific verb ('List'), a specific resource ('Service Broker queues'), and a clear scope ('all ... in a database'), with an optional filter. This clearly distinguishes it from sibling tools like list_broker_services or list_tables.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool when you need to list Service Broker queues, optionally filtered by schema. It does not explicitly mention alternatives or exclusions, but the resource type is unambiguous enough to guide selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_stored_proceduresA
List all stored procedures in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the core behavior (listing procedures with optional schema filter) but does not mention return format, inclusion of system procedures, or any permissions needed. For a simple read-only list tool, this is minimal but acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that is front-loaded with the verb and resource, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and parameters are fully described in the schema. However, there is no output schema and the description does not specify what the response contains (e.g., names only vs. fully qualified objects). Given the sibling tools include a definition retriever, the description could have clarified the scope of 'listing' to aid selection.
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 already documents both parameters with descriptions (100% coverage). The description adds only that the schema filter is optional, which is already implied by the parameter not being required. It does not explain the database parameter 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 'List' with a clear resource 'stored procedures' and scoping 'in a database, optionally filtered by schema'. This distinguishes it from sibling tools like list_tables, list_views, and get_stored_procedure_definition by resource and action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to enumerate stored procedures, but does not explicitly state when not to use or mention alternatives such as get_stored_procedure_definition for retrieving definitions. There is no explicit exclusion or comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_synonymsA
List all synonyms in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of disclosing behavior. It states the core action and optional schema filter, but does not disclose return format, default database behavior, or any permissions. It is not misleading but lacks depth beyond the obvious.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It efficiently conveys the tool's purpose and key optional behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, with two optional parameters and no output schema. The description adequately explains the tool's primary function, but could be more complete by specifying the exact return fields (e.g., synonym names, schemas). However, 'list all synonyms' implies the return of a synonym list, which is sufficient for 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 100%, so the baseline is 3. The description mentions 'optionally filtered by schema', which aligns with the schema parameter but doesn't add significant meaning beyond what the input schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List'), resource ('synonyms'), and scope ('in a database, optionally filtered by schema'). This distinguishes it from sibling tools like list_tables and get_synonym_definition, which serve different purposes.
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 clear context on when to use the tool (to list synonyms) and mentions an optional filter (by schema). While it doesn't explicitly name alternative tools, the context is sufficient and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesA
List all tables in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states 'List all tables' which implies a read-only operation, but it does not disclose any behavior such as whether system tables are included, error handling, or any side effects. The description adds no detail beyond what the name already communicates.
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 sentence, front-loaded with the action, and contains no unnecessary words. It is appropriately sized for the tool's simple purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with two optional parameters and no output schema, the description is minimally viable. However, it does not explain what the return value looks like (e.g., table names only, fully qualified names, metadata), and it does not clarify whether all tables include system tables. This leaves some gaps for an agent.
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 the 'schema' and 'database' parameters. The description's phrase 'optionally filtered by schema' aligns with the schema parameter but does not add meaning beyond what the schema descriptions already provide. 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 uses the specific verb 'List' with the resource 'tables in a database', and explicitly mentions the optional schema filter. This clearly distinguishes it from sibling tools like list_views and list_schemas, which target different resource 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 implies usage through its name and phrasing, but it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. It would benefit from noting that it covers tables specifically, not views or other objects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_temporal_tablesA
List all system-versioned temporal tables in a database, showing the linked history table for each
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly implies a read-only list operation, but it does not mention permissions, performance considerations, or behavior when no temporal tables exist. The lack of explicit safety disclosure 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 a single sentence, front-loaded with the action and resource, and contains no redundant or unnecessary words. It is highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple list tool with optional filter parameters and no output schema. The description covers the main functionality (listing temporal tables and showing history tables) and the schema covers parameter semantics. It does not mention that schema filtering is optional, but this is a minor gap given the 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?
Both parameters ('schema' and 'database') have descriptions in the input schema, providing 100% coverage. The description does not add additional meaning to the parameters, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List all system-versioned temporal tables in a database, showing the linked history table for each.' It uses a specific verb ('List') and distinguishes this tool from siblings like list_tables by focusing on temporal tables and the inclusion of the history table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing temporal tables, but it does not explicitly mention when to use this tool over alternatives such as list_tables, nor does it provide any when-not-to-use guidance. The context is clear but no alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_triggersA
List all DML triggers in a database, optionally filtered by schema and/or parent table
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | Filter by parent table name | |
| schema | No | Filter by parent table schema (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden. The verb 'List' implies a read-only operation, but the description does not disclose what the returned data contains (e.g., trigger names, metadata, whether definitions are included), nor does it mention permissions or any other behavioral details. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that directly states the tool's purpose and optional filters. Every word contributes value, and there is no fluff or repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool, the description is adequate but incomplete. There is no output schema, so the agent must infer what the returned list contains; the description does not specify fields or clarify that trigger definitions are not included (which get_trigger_definition handles). This ambiguity is a notable gap given the lack of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all three parameters (100% coverage), so the baseline is 3. The description's phrase 'optionally filtered by schema and/or parent table' paraphrases the schema's filter descriptions and reinforces optionality, which is helpful but does not add substantive new information beyond what the schema already communicates.
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 specifies the tool's action ('List all DML triggers'), the resource ('DML triggers in a database'), and the optional filters ('by schema and/or parent table'). This distinguishes it from sibling tools like get_trigger_definition and other list_* operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when the agent needs to list DML triggers and mentions optional filters, providing clear context. However, it does not explicitly contrast with alternatives like get_trigger_definition or state when not to use this tool, so it does not fully meet the 'when-not/alternatives' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_user_typesA
List all user-defined types (scalar alias types and table types) in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses only the listing scope and filtering option, but does not mention that it is a read-only metadata operation, any permission requirements, or what the returned data contains. For a tool with zero annotation support, this is a significant gap in 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 a single sentence with clear front-loading of the action and object. Every word contributes necessary information without 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 simple listing tool with two optional parameters, the description gives the essential scope but omits any indication of return fields or output structure. Since there is no output schema and no annotations, the description could better set expectations about the 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 100%, so both parameters are well-documented in the schema itself. The description adds the phrase 'optionally filtered by schema' but does not add significant meaning beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' with the resource 'user-defined types' and clarifies scope with parenthetical 'scalar alias types and table types'. This distinguishes it from sibling tools like list_tables and list_views, which target different object 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 implies usage for retrieving user-defined types but provides no explicit when-to-use guidance or alternatives. It mentions optional schema filtering, giving some context, but does not exclude other tools like get_table_type_columns for related needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_viewsB
List all views in a database, optionally filtered by schema
| Name | Required | Description | Default |
|---|---|---|---|
| schema | No | Schema name to filter by (e.g. dbo) | |
| database | No | Database name (defaults to the configured default database) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose whether system views are included, the return format, or any performance implications. It only restates the basic operation without adding 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 a single, front-loaded sentence with no wasted words. It efficiently communicates the core action and optional filter in 13 words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with two well-documented optional parameters and no output schema. The description covers the basic scope but lacks details about output contents, view types, or edge cases, leaving clear gaps for a minimally adequate description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptive comments for both parameters. The phrase 'optionally filtered by schema' adds no new semantic meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the resource ('views in a database') with an optional schema filter. It clearly distinguishes this tool from siblings like describe_view (which describes one view) and list_tables (which lists tables).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The description merely states what it does, with no mention of appropriate contexts, exclusions, or relationships to sibling tools such as describe_view or list_schemas.
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. Dates show when Glama detected each change.
37 tool updates
v1.0.0- First observed
describe_table - First observed
describe_view - First observed
execute_query - First observed
get_extended_properties - First observed
get_foreign_keys - First observed
get_function_definition - First observed
get_job_history - First observed
get_object_permissions - First observed
get_server_properties - First observed
get_stored_procedure_definition - First observed
get_synonym_definition - First observed
get_table_constraints - First observed
get_table_indexes - First observed
get_table_stats - First observed
get_table_type_columns - First observed
get_trigger_definition - First observed
list_agent_jobs - First observed
list_broker_services - First observed
list_database_roles - First observed
list_database_users - First observed
list_databases - First observed
list_fulltext_catalogs - First observed
list_fulltext_indexes - First observed
list_functions - First observed
list_linked_servers - First observed
list_partition_functions - First observed
list_partition_schemes - First observed
list_schemas - First observed
list_sequences - First observed
list_service_queues - First observed
list_stored_procedures - First observed
list_synonyms - First observed
list_tables - First observed
list_temporal_tables - First observed
list_triggers - First observed
list_user_types - First observed
list_views
TDQS
Each tool targets a distinct SQL Server metadata entity or action (e.g., tables, views, procedures, functions, triggers, partitions, fulltext, service broker, agent jobs). There is no meaningful overlap; list_* tools enumerate while get_*/describe_* tools retrieve details, and execute_query handles read-only SQL.
Nearly all tools follow a consistent verb_noun pattern using snake_case, with list_ for enumeration and get_ for definition retrieval, plus a few describe_ and execute_ exceptions that still fit the pattern. No mixed styles or vague verbs.
With 37 tools, the server exceeds the 25+ threshold that typically indicates too many for an agent to easily manage. While each tool covers a specific SQL Server object type, the sheer number may present navigation and context-window challenges.
The tool set provides comprehensive coverage of SQL Server metadata: databases, schemas, tables, views, procedures, functions, triggers, constraints, indexes, foreign keys, permissions, users, roles, sequences, partitions, fulltext, service broker, agent jobs, linked servers, and querying. Minor omissions like DDL triggers are negligible given the scope.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- dataOAuthco.thinair
Read-only PostgreSQL, MySQL, SQL Server access via MCP — 24 dialect-aware hosted tools.
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRead-only SQL Server MCP server enabling safe database queries, table listing, and schema inspection with built-in security protections.MIT
- FlicenseAqualityDmaintenanceMCP server for connecting to SQL Server in readonly mode. Allows any MCP client to explore the schema and run SELECT queries against a SQL Server database.6-
- AlicenseAqualityBmaintenanceMCP server for querying and managing multiple databases (SQLite, PostgreSQL, MySQL) with read-only mode and schema inspection.13MIT
- AlicenseAqualityCmaintenanceRead-only PostgreSQL database MCP server for safely exploring schema, tables, relationships, and sample data without modification.1083MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/teghoz/sql-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server