MCP server providing read-only SQL Server database introspection and query execution tools
MSSQL MCP server has 10 tools with consistent naming (verb_noun pattern: list_*, describe_*, get_*, search_*, find_*, execute_*) and basic descriptions. However, parameter descriptions are entirely absent, no tool documents what its input parameters control or accept. Input schemas are present but minimal (most have only 'type' and 'required' fields, no 'description' for parameters). Output schemas are not documented anywhere in the provided code. Error handling exists (McpCallToolResult.Error) but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY. Tool descriptions are adequate (50-100 chars) but lack WHEN/WHY context. This is a typical community server: functional but missing the parameter-level documentation and output schema clarity that production tools require.
Returns column name, data type, nullability, and max length for a table (schema.table or table name).
Execute read-only SQL.
Objects that reference a table or view.
Get SQL definition for procedure, view, trigger or function.
Lists user functions as schema.function (excludes system and numbered variants).
Lists user stored procedures as schema.procedure (excludes system and numbered variants).
Lists user base tables as schema.table (excludes system and temporal history tables).
No parameter descriptions in any tool. Input schemas define 'type' and 'required' but omit 'description' for every parameter. LLMs cannot infer what 'tableName', 'text', 'objectName', or 'sql' parameters control without explicit documentation.
No output schemas documented. Tool descriptions do not specify what fields are returned, their types, or structure. LLMs cannot plan downstream calls or extract required data (e.g., does list_tables return schema.table strings or objects with schema/table fields?).
No tool annotations despite all tools being READ_ONLY. Missing readOnlyHint in tool definitions. Agents cannot distinguish safe tools from destructive ones without explicit annotations.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
Lists triggers as parent.trigger.isDisabled (parent is schema.table or (database)).
Lists views as schema.view
Find objects by text in module body.
Error responses lack recovery guidance. McpCallToolResult.Error() returns only a message string. No indication of whether error is retryable, user-fixable, or fatal. No suggestions for next steps (e.g., 'Table not found. Try list_tables() first.').
execute_read_query accepts arbitrary SQL with no validation or constraints. No mention of query timeout, result row limits, or cell length limits (which exist in AppSettings.QueryOptions but are not exposed to the LLM). Risk of runaway queries or context window exhaustion.