Enterprise-grade MCP server for Azure SQL with Azure AD auth, 34 tools, and tiered safety gates
36 tools with consistent naming (verb_noun pattern: query, exec, list_*, get_*) and descriptions present for all. However, descriptions are terse (avg ~60 chars, well below the 194-char baseline for A+ tools). Input schemas are visible and typed, but lack depth: no enums for constrained values (e.g., 'auth' accepts 'azuread|sql|connstr' but no enum), no min/max bounds on numeric params, no format specs. Output schemas are not documented, LLMs cannot predict response structure. Error handling is absent from tool definitions. Three-tier safety model (tierRead/tierWrite/tierDangerous) is implemented server-side but not exposed in tool annotations or descriptions, forcing LLMs to guess which tools are destructive. Missing idempotent/readOnly/destructive hints.
Add a new database connection at runtime without restart
Get schema information for a table (columns, types, constraints)
Execute a write operation (INSERT, UPDATE, DELETE, MERGE) with safety confirmation
Execute dangerous operations (DROP, TRUNCATE, ALTER, GRANT, etc.) with multi-factor safety gates
Get check constraints for a table
Get statistics for a specific column
Get detailed information about a specific connection
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Baseline: 100% of A+ tools document return types.
Descriptions are terse (avg ~60 chars vs 194-char baseline). Missing WHEN to use, prerequisites, and side effects. E.g., 'Execute a SELECT query' lacks guidance on limit behavior, error cases, or when to call describe_table first.
No enum constraints on 'auth' parameter (add_connection). Accepts 'azuread|sql|connstr' but no formal enum, LLMs may hallucinate invalid values like 'oauth' or 'mfa'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Get database-level metadata and statistics
Get user permissions on the database
Get default constraints for a table
Get foreign key relationships for a table
Get the SQL definition of a user-defined function
Get parameters for a user-defined function
List all server logins
Get primary key information for a table
Get the SQL definition of a stored procedure
Get parameters for a stored procedure
Get members of a database role
List all database roles
Get user permissions on the server
Get members of a server role
List all server roles
Get user permissions on a table
Get row count and size statistics for a table
Get triggers defined on a table
Get unique constraints for a table
List all database users
Get the SQL definition of a view
List all available database connections
List all user-defined functions in the database
List all indexes on a table
List all schemas in the database
List all stored procedures in the database
List all tables in the database
List all views in the database
Execute a SELECT query against the database
Safety tiers (tierRead/tierWrite/tierDangerous) implemented server-side but not exposed via tool annotations. LLMs cannot see which tools are destructive (exec_dangerous) vs read-only (query). Missing readOnlyHint, destructiveHint, idempotentHint.
No pagination support documented. 'list_tables', 'list_views', etc. lack limit/offset params and total count in response. Large schemas will blow context window.