MCP SQL Server - Modular SQL database access via MCP protocol with support for multiple database types (SQL Server, MySQL, PostgreSQL)
This MCP SQL Server provides 7 tools with consistent naming patterns and good descriptions. All tools follow verb_noun convention (list_, get_, explore_, describe_, query_, execute_). Parameter schemas are present and mostly well-typed. However, there are critical gaps: (1) Output schemas are not documented anywhere in the provided code, LLMs cannot infer what fields to expect from tool responses; (2) Parameter descriptions lack detail about constraints, ranges, and formats, e.g., 'limit' parameters mention defaults but not why max=100 or max=1000 matters; (3) No error handling guidance visible in tool definitions, agents won't know what to do if a query fails; (4) Credentials (user, password) are exposed as optional parameters, violating secret injection patterns. The 7 tools are well-named and cover a coherent domain (SQL exploration and read-only queries), but lack the depth needed for production use.
Get detailed table description including columns, primary keys, foreign keys, indexes and row count
Execute a SELECT query safely with validation and row limit enforcement
Get sample data from table
Get list of databases on server
Get list of tables in database
List servers configured via environment variables
Query specific columns from table
No output schemas documented for any tool. LLMs cannot infer response structure, forcing them to guess what fields are available for downstream planning. This violates the core pattern:tool-description requirement.
Credentials (user, password) exposed as optional tool parameters. Violates pattern:secret-injection, credentials must be injected server-side via environment variables, not passed as parameters where they enter logs and agent traces.
Parameter descriptions lack actionable constraints. 'Maximum number of rows to retrieve (default: 5, max: 100)' tells the LLM the limit but not WHY, no explanation of performance impact or API rate limits. Also missing: regex patterns, length constraints, enum values where applicable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 60 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
No error handling guidance in tool definitions. If execute_select_query receives malformed SQL, what error does it return? Can the LLM retry? Should it ask the user? No recovery guidance visible.
Parameter descriptions are generic and under 72 chars (baseline for param descriptions). E.g., 'Database user (optional, uses environment variable if not provided)' repeats 'optional' in name AND description, wasting tokens. Descriptions should focus on WHAT the user is controlling, not implementation details.
The 'columns' parameter in query_columns is typed as array but has no description of constraints, e.g., is it limited to 50 columns? Does it accept * as wildcard? Can it be empty? These details prevent LLMs from using the tool correctly.